在模态视图中,我有一个在viewDidLoad
中分配和初始化的UIPickerView。
在dealloc
中使用此视图中使用的其他对象取消分配。
这是解除分配我的选择器的错误方法吗?为什么在模态视图被解除后需要被访问,因为错误消息似乎在暗示?
僵尸日志错误是:
-[UIPickerView release]: message sent to deallocated instance 0x5a441
相关代码:
- (void)viewDidLoad
{
[super viewDidLoad];
//navigation bar stuff here
mcPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 244, 320, 216)];
mcPickerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
// setup the data source and delegate for this picker
mcPickerDataSource = [[MCPickerDataSource alloc] init];
mcPickerView.dataSource = mcPickerDataSource;
mcPickerView.delegate = mcPickerDataSource;
mcPickerView.showsSelectionIndicator = YES;
[self.view addSubview:mcPickerView];
}
- (void)dealloc
{
[mc dealloc];
[mcPickerView dealloc];
[mcPickerDataSource dealloc];
[mcVal release];
[super dealloc];
}
答案 0 :(得分:1)
你应该只在super上调用dealloc。其他一切都应该发布。
这个答案将解释原因: iPhone SDK: Dealloc vs. Release?
答案 1 :(得分:1)
在你的dealloc方法中,你的[mcPickerView dealloc]
可能还为你释放了mcPickerDataSource,因为mcPickerView保存了对mcPickerDataSource的引用。更改你的dealloc方法以释放除super之外的所有内容应解决问题。
答案 2 :(得分:1)
在viewDidLoad中分配的任何内容:应该在viewDidUnload中释放,而不是dealloc'd。这是因为viewDidLoad和viewDidUnload可能在对象的整个生命周期中被调用多次。 Dealloc仅在对象的生命周期中被调用一次。