Необходимо сохранить контроллер для источника данных и делегата uiPickerview?

Насколько я понял, мне не следует оставлять контроллер, который является делегатом или источником данных. Я сделал 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 не сохраняет свой делегат и источник данных до тех пор, пока он не будет уничтожен?


person Dean Davids    schedule 02.10.2011    source источник
comment
Разве pickerView не сохраняет свой делегат и источник данных до тех пор, пока он не будет уничтожен? Нет, не сохраняет их.   -  person albertamg    schedule 02.10.2011
comment
тогда это единогласно. Я ошибался. Тогда просто кажется, что это ожидающая утечка или память удерживается без причины, поскольку я должен предвидеть все возможности и освобождать/сохранять по мере необходимости.   -  person Dean Davids    schedule 02.10.2011


Ответы (2)


Если Picker создает экземпляр источника данных, его можно сохранить, его нужно где-то сохранить. Только обязательно отпустите.

Обратите внимание, что источники данных обрабатываются иначе, чем делегаты.

person zaph    schedule 02.10.2011

В основном (насколько я знаю) делегаты не сохраняются в своих классах. Они просто назначены так,

@property(nonatomic, assign) id <TheDelegateClass> delegate;

Вызывающая сторона несет ответственность за сохранение делегата до тех пор, пока работа делегатов не будет завершена.

Ответ на ваш вопрос: UIPickerView не сохраняет своего делегата. Вместо этого он ожидает, что вы сохраните его.

person EmptyStack    schedule 02.10.2011