这里的第一个问题,这是关于iPhoneOS3而不是MacOSX。我是Objective-C的新手,我从未在没有自动垃圾收集的环境中开发,所以我对此有点困惑。以下是一些有效的代码,它将视图控制器分配给Apple.com上的一个示例:
MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
[self setMyViewController:aViewController];
[aViewController release];
所以,根据我的理解,我必须释放 aViewController ,因为它首先被分配(+ 1 = 1);然后保留在二传手中(+1 = 2);然后在setter中释放(-1 = 1);然后不再需要,所以最终再次释放(-1 = 0)并释放内存。我可以不只是跳过分配临时对象 aViewController 并嵌套这些函数,如下所示:
[self setMyViewController:[[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];
我想知道这是否可以正常工作?我有点担心,因为setter需要一个指向ViewController的指针,而不仅仅是一个副本。因为我只传递一个返回值,所以setter中指向ViewController的指针指向可以在分配之前删除或丢失的数据吗?我很抱歉,如果这似乎是一个愚蠢的问题,但我很难在任何地方找到答案,我正在努力为非垃圾收集环境建立良好的技术。谢谢!
答案 0 :(得分:1)
不要考虑绝对保留计数方面的内存管理。完全从所有权和封装的角度来考虑它。
当你alloc
一个对象时,你已经创建了一个你拥有的对象。当您将该对象设置为另一个对象上的值时,该另一个对象应该保留该对象以表示所有权。如果您的代码不再对该对象感兴趣,那么您应该release
(或autorelease
如果您想将其返回其他内容,那么。
[self setMyViewController:[[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];
要回答您的具体问题,上述代码行本身会导致内存泄漏,假设-setMyViewController:
已正确实施。
答案 1 :(得分:1)
我已经确定此代码可以正常工作,并且不会导致内存泄漏:
MyViewController *aViewController = [[[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease];
[setMyViewController:aViewController];
感谢所有帮助人员!
答案 2 :(得分:0)
[self setMyViewController:[[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];
这里你分配,然后它被保留,所以你马上有一个保留计数2.但是它会被正确设置,因为你仍然将setter指向视图控制器。
如果属性MyViewController的类型为assign(not retain),则保留计数为1。