#ios #delegates #uipickerview #retain #uipickerviewcontroller
#iOS #делегаты #uipickerview #сохранить #uipickerviewcontroller
Вопрос:
Как я понял, я не должен сохранять контроллер, который является делегатом или источником данных. Я создал UIPickerView, созданный в методе доступа к свойствам как таковой:
-(UIPickerView *)projectPicker {
if (_projectPicker != nil) {
return _projectPicker;
}
//Create Picker View
UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 185, 0, 0)];
picker.showsSelectionIndicator = YES;
//Create source and delegate
NSString *titleForRow0 = NSLocalizedString(@"<<Make Selection>>", @"projectPicker nil Label 0");
NSArray *titlesForFirstRows = [[NSArray alloc] initWithObjects:titleForRow0, nil];
ProjectPickerDatasource *pickerSource = [[ProjectPickerDatasource alloc] initWithManagedObjectContext:self.managedObjectContext
selectedProject:self.currentProject
andTitlesForFirstRows:titlesForFirstRows];
[titlesForFirstRows release];
picker.delegate = pickerSource;
picker.dataSource = pickerSource;
self.projectPicker = picker;
[pickerSource release];
[picker release];
return _projectPicker;
}
Это сбой, сообщающий о попытке доступа к нераспределенному экземпляру pickerSource. Если я выделю компонент pickerSource как другое свойство, тем самым сохранив его в этом контроллере, он работает отлично. Я не думал, что это правильная реализация. Разве pickerView не сохраняет свой делегат и источник данных до тех пор, пока он не будет уничтожен?
Комментарии:
1. «Разве pickerView не сохраняет свой делегат и источник данных до тех пор, пока он не будет уничтожен?» Нет, он их не сохраняет.
2. тогда это единогласно. Я ошибся. Тогда просто кажется, что это ожидающая утечки или память, удерживаемая без причины, поскольку я должен предвидеть все возможности и освобождать / сохранять по мере необходимости.
Ответ №1:
Если средство выбора создает экземпляр источника данных, его можно сохранить, его нужно где-то сохранить. Просто обязательно отпустите его.
Обратите внимание, что источники данных обрабатываются иначе, чем делегаты.
Ответ №2:
В основном (насколько я знаю) делегаты не сохраняются их классами. Они просто назначаются следующим образом,
@property(nonatomic, assign) id <TheDelegateClass> delegate;
Вызывающий абонент несет ответственность за сохранение делегата до завершения задания делегатов.
Ответ на ваш вопрос: UIPickerView не сохраняет своего делегата. Он ожидает, что вы сохраните его вместо этого.