Я довольно новичок в языке target-c (менее трех месяцев), но это то, что мне действительно нужно понять.
Предположим, что есть контроллер (в среде iOS), который управляет табличным представлением для ввода данных от пользователя. Таблица должна иметь редактируемые ячейки и некоторые функции, чтобы упростить выбор значений, например, кнопка, которая отображает всплывающее окно с возможными значениями для поля.
Предположим, есть поле для хранения названий стран. Поповер сначала показывает список континентов; когда пользователь выбирает континент, контроллер всплывающего окна должен отображать страны предварительного просмотра выбранного континента.
Теперь этот поповер появляется во многих местах приложения, поэтому было бы хорошо, если бы я мог инкапсулировать его для дальнейшего использования. То, что я буду ожидать от этого поповера, выглядит примерно так:
...
@protocol MyPopoverDelegate<NSObject> {
-(void)didSelectCountry:(NSString *)countryName;
{
...
MyPopoverController *dataSelector = [[MyPopoverController] alloc] init];
dataSelector.dataType = CountryDataType;
dataSelector.delegate = self;
[dataSelector show];
[dataSelector release];
...
Проблема здесь в строке [dataSelector release]
, потому что код для управления всплывающим окном должен оставаться в живых, пока не будет выбрана страна. Это означает, что переменная dataSelector
должна быть свойством класса вызывающего, и это отстой.
Тогда возникает вопрос:
Как я могу организовать такие ситуации, чтобы иметь многоразовый контроллер?
Спасибо
Отредактировано после ответа водханга:
Хорошо, это хорошо, но dataSelector
все еще является собственностью.
Что если я сделаю:
@implementation MyPopoverController
- (id)init {
...
[self retain];
...
}
- (void)popoverControllerDidDismissPopover: (UIPopoverController *)popoverController {
...
[delegate didFinishSelectingCountry:countryName];
[self release];
}
@end
Я никогда не вижу такого поведения в объективе-c, я чувствую, что это не идея.
Почему это неправильно?