据我了解,我不应该保留一个作为委托或数据源的控制器。我创建了一个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是否会保留它的委托和数据源,直到它被销毁?
答案 0 :(得分:1)
如果Picker实例化数据源,可以保留它,它需要保留在某个地方。一定要发布它。
请注意,数据源的处理方式与委托不同。
答案 1 :(得分:1)
主要(据我所知),代表不会被他们的班级保留。他们只是这样分配,
@property(nonatomic, assign) id <TheDelegateClass> delegate;
调用者有责任保留代理,直到代理人的工作结束。
您的问题的答案是UIPickerView不保留其委托。它希望你保留它。