需要为数据源和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在销毁之前不会保留它的委托和数据源吗?

如果Picker实例化了数据源,那么保留它是可以的,它需要保留在某个地方。只是一定要释放它。

请注意,数据源的处理方式与委托不同。

大多数情况下(据我所知)委托不是由它们的类保留的。它们是这样分配的

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

调用方有责任保留委托,直到委托的工作结束。

你问题的答案是UIPickerView不保留它的委托。它希望您保留它。

最新更新