【问题标题】:Why is this object being deallocated?为什么这个对象被释放?
【发布时间】:2010-12-18 14:42:30
【问题描述】:

我正在开发一个 iPhone 应用程序,我正在尝试将一个视图推送到导航控制器中,我之前已经做过很多次了,但是,我在使用这个特定的应用程序时遇到了一些问题。我有一个表格视图,当用户选择一行时,新视图被推送到控制器中:

DataWrapper *row=[[self.rows objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];
DataViewController *nextController=[[DataViewController alloc] initWithNibName:@"Data" bundle:[NSBundle mainBundle]];
[nextController setInfo:row];
[nextController setRow:[indexPath row]];
[nextController setParent:self];
[self.navigationController pushViewController:nextController animated:YES];
[nextController release];

一切正常,直到用户点击后退按钮,我得到一个异常,并使用 NSZombieEnabled 并得到这个:

-[DataViewController respondsToSelector:]: message sent to deallocated instance 0x4637a00

所以我尝试删除[nextController release],实际上它起作用了,但是为什么????我分配了nextController,所以我应该释放它,对吧??如果有这样的事情,我觉得发布这个应用程序是不对的,我觉得它会失败。请让我知道你的想法。

【问题讨论】:

  • 父控制器视图中发生的任何特殊情况(Will/Did)会出现吗?也许涉及另一个未保留或过度释放的实例变量?

标签: objective-c iphone exception memory-management


【解决方案1】:

但它似乎适用于:

DetailViewController *controller = [[DetailViewController alloc] initWithNibName:@"SomeView" bundle:nil]; 

controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController: controller animated:NO];

[controller release];

那么,为什么它对 pushViewController 不起作用?

【讨论】:

    【解决方案2】:

    导航控制器没有保留您的nextController。如果你释放它,因为只有一对init/release,对象被释放。稍后当navigationController 尝试向它发送消息时,您会收到您看到的错误。

    这也是删除[nextController release] 解决问题的原因。

    你是对的,如果你分配了,你应该释放它。但需要注意的是你的应用程序完成之后,而不是之前

    有些对象将在应用程序的几乎整个生命周期内保持分配状态,所以不要觉得太糟糕。

    【讨论】:

    • 我认为干净的方法是在- viewDidLoad 方法中分配DataViewController,然后在- viewDidUnload 方法中再次释放它。
    • 我明白了,我认为当您使用 pushViewController 时,NavigationController 会获得该对象的所有权。我会尝试在 viewDidLoad 中分配控制器。
    • @Leg10n:除非文档明确说明一个方法将retain 一个对象,或者一个属性具有retain 的设置器,否则永远不要假设另一个对象将获得所有权。
    【解决方案3】:

    出于调试目的,我将在您的 DataViewController 类中覆盖 -dealloc,并在其上设置断点。

    【讨论】:

      【解决方案4】:

      您的导航控制器是否可能以某种方式被释放,导致视图控制器也被释放?您可以通过在推送nextController 之前保留导航控制器来测试它。

      【讨论】:

        【解决方案5】:

        我猜[self.navigationController] 会返回nil,因为如果不是nil,它将保留您的对象。由于您的对象没有被保留,因此似乎没有任何对象试图保留它,这表明 navigationController 属性为空。

        【讨论】:

        • 这并不能解释为什么它会起作用......如果在 nil 上调用它,屏幕将永远不会出现。
        猜你喜欢
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-30
        • 2012-02-01
        • 1970-01-01
        • 2011-04-17
        相关资源
        最近更新 更多