dealloc pickerview在哪里?

时间:2011-06-04 16:09:22

标签: iphone objective-c ios4 memory-management

在模态视图中,我有一个在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];
}

3 个答案:

答案 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仅在对象的生命周期中被调用一次。