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

Posted

技术标签:

【中文标题】是否需要保留数据源的控制器和 uiPickerview 的委托?【英文标题】:Necessary to retain controller for datasource and delegate of uiPickerview? 【发布时间】:2011-10-02 13:53:21 【问题描述】:

据我了解,我不应该保留作为委托或数据源的控制器。我制作了一个 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 在销毁之前不会保留它的委托和数据源吗?

【问题讨论】:

"pickerView 在销毁之前不保留它的委托和数据源吗?"不,它不会保留它们。 那是一致的。我误解了。似乎这是一个等待发生的泄漏或无缘无故持有的内存,因为我必须预测所有可能性并酌情释放/保留。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

大多数情况下(据我所知)代表不会被他们的班级保留。他们就是这样分配的,

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

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

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

【讨论】:

以上是关于是否需要保留数据源的控制器和 uiPickerview 的委托?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过良好的设计保留堆栈空间?

如何在 ViewController 之外符合 UIPickerViewDelegate 和 UIPickerViewDataSource?

在数据库中保留小计字段是否一个坏主意

TCP协议中的保留位、偏移位、控制位

dismissViewControllerAnimated:completion: 是不是保留以前的视图控制器?

自动释放和保留的使用