首先,我从未在我的应用程序中看到过这么多内存问题,因为我在读完一篇关于内存在obj-C中的行为的文章后,到处开始放置“自我”。现在,我得到了各种各样的问题(揭示了我编码的邋))。当然,我是Objective-C的新手,我承认在我的生活中,我从未遇到过如此多的内存管理问题。但我认为需要练习才能适应这一点。
现在,问我的问题。
我有一个类接口属性(self.todoCreate),它包含对上述控制器的引用。按下按钮即可导航到该控制器。
@property (nonatomic, retain) TodoTaskCreateController *todoCreate;
以下代码是导致导航视图更改的代码段:
TodoTaskCreateController *viewController = [[TodoTaskCreateController alloc]
initWithNibName:@"TodoTaskCreateController"
bundle:[NSBundle mainBundle]];
self.todoCreate = viewController;
[viewController release];
// slide-in todoCreate controller.
if (self.navigationController != nil && self.todoCreate != nil) {
[self.navigationController pushViewController:self.todoCreate animated:YES];
}
所以这是我的问题:
我第一次运行它有效。
一旦我进入第二个视图屏幕,我就会导航回到主视图。
如果我第二次尝试再次导航,那么应用程序崩溃,就在self.todoCreate
被分配viewController
的位置。
请注意,在主视图的viewDidAppear
方法中,我调用[self.todoCreate release]
。
任何人都能解释一下吗?
PS - 难怪有这么多iPhone应用随机崩溃。
答案 0 :(得分:1)
todoCreate
是一个属性,这意味着当你为它赋值时,它会调用一个名为setTodoCreate
的方法,它看起来像:
- (void) setTodoCreate:(Foo*) newVal
{
[todoCreate release]; // release the previous object
todoCreate = [newVal retain]; // point to new object, and also retain it
}
现在,您的viewDidAppear
方法正在发布self.todoCreate
,此时todoCreate
的保留计数为0.当您创建新的TodoTaskCreateController
并将其分配给{{1执行另一个self.todoCreate
,但这次是在保留计数为0的对象上。
而不是release
,您应该使用[self.todoCreate release]
。
您可能不应该不断地破坏和创建self.todoCreate = nil
。
您对应用程序崩溃的评论很可能是因为开发人员没有测试他们的应用程序,看它是否正确处理了内存警告。在模拟器中有一个菜单选项来模拟这个,你的应用程序应该在所有视图中“生存”警告。
答案 1 :(得分:0)
我不打算很快说话,但它表示我已经解决了崩溃问题,只需将viewController添加到自动释放池中,然后删除其发布的所有手动操作。
现在,如果我的@property for createTodo被定义为(非原子,保留)而不是(非原子,赋值)吗?