是否需要保留uiPickerview的数据源和委托控制器?

时间:2011-10-02 13:53:21

标签: ios delegates uipickerview retain 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是否会保留它的委托和数据源,直到它被销毁?

2 个答案:

答案 0 :(得分:1)

如果Picker实例化数据源,可以保留它,它需要保留在某个地方。一定要发布它。

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

答案 1 :(得分:1)

主要(据我所知),代表不会被他们的班级保留。他们只是这样分配,

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

调用者有责任保留代理,直到代理人的工作结束。

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