2009-08-01 139 views
1

首先,我从未在我的应用程序中看到如此多的内存问题,因为在阅读关于内存如何在obj-C中运行的文章后,我开始放置“自我”。现在,我得到各种问题(揭示了我的编码的sl iness)。当然,我是Objective-C的新手,我承认在我的人生之前,我从未有过很多与内存管理有关的问题。但我认为这需要习惯才能习惯。UINavigationViewController内存释放

现在,对我的问题。

我有一个类接口属性(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

我不会很快说话,但它似乎已经解决了崩溃,只需将viewController添加到autorelease池中,然后删除其版本的所有手动发生。

现在,如果我的@property for createTodo被定义为(nonatomic,retain)而不是(nonatomic,assign)?

+0

如果你做“自我”。todoCreate = `具有`retain`属性,旧值将被释放;如果您对`assign`属性执行相同的操作,则旧值不会被释放。 – 2009-08-02 22:02:32

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并将其分配给self.todoCreate另一release进行,但这次保留的0

计数代替对象上,你应该使用self.todoCreate = nil

您可能不应该不断破坏并创建您的TodoTaskCreateController

您对应用程序崩溃的评论很可能是由于开发人员未测试其应用程序以查看它是否正确处理内存警告。在模拟器中有一个菜单选项来模拟这个,你的应用程序应该“存活”它的观点所有的警告。