【问题标题】:Where to dealloc pickerview?在哪里释放pickerview?
【发布时间】:2011-06-04 16:09:22
【问题描述】:

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

【问题讨论】:

  • 请出示您的 viewDidLoad 和 dealloc 代码

标签: iphone objective-c ios4 memory-management


【解决方案1】:

你应该只在 super 上调用 dealloc。其他一切都应该发布。

这个答案将解释原因: iPhone SDK: Dealloc vs. Release?

【讨论】:

    【解决方案2】:

    在您的 dealloc 方法中,您的 [mcPickerView dealloc] 可能还为您处理了 mcPickerDataSource,因为 mcPickerView 包含对 mcPickerDataSource 的引用。更改您的 dealloc 方法以释放除 super 之外的所有内容应该可以解决问题。

    【讨论】:

      【解决方案3】:

      viewDidLoad 中分配的任何内容:应该在 viewDidUnload 中释放,而不是解除分配。这是因为 viewDidLoad 和 viewDidUnload 在对象的生命周期中可能会被调用多次。 Dealloc 在对象的生命周期中只被调用一次。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-27
        • 2015-01-07
        • 1970-01-01
        • 2011-03-14
        • 2011-03-22
        • 2014-08-28
        • 1970-01-01
        相关资源
        最近更新 更多