首先,自从阅读了一篇关于内存在obj-C中的行为的文章后,我开始在应用程序中放置"self“,我从未见过如此多的内存问题。现在,我得到了各种各样的问题(暴露了我的编码的草率)。虽然我是目标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]。
有人能解释一下吗?
难怪这么多iPhone应用程序会随机崩溃。
发布于 2009-08-01 04:18:15
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并将其分配给self.todoCreate时,将执行另一个release,但这次是在保留计数为0的对象上执行的。
而不是[self.todoCreate release],您应该使用self.todoCreate = nil。
您可能也不应该不断地破坏和创建TodoTaskCreateController。
您对应用程序崩溃的评论很可能是因为开发人员没有测试他们的应用程序,看它是否正确地传递内存警告。在模拟器中有一个菜单选项来模拟这一点,您的应用程序应该在其所有视图中“经受住”警告。
发布于 2009-08-01 04:17:07
我不会很快与您交谈,但我似乎已经解决了这个问题,只需将viewController添加到自动发布池中,然后删除它的所有手动发布。
现在,如果我的@ createTodo属性被定义为(非原子的,保留的)而不是(非原子的,赋值),这有关系吗?
https://stackoverflow.com/questions/1215782
复制相似问题