【发布时间】:2010-02-08 05:14:14
【问题描述】:
这里的第一个问题,这是关于 iPhoneOS3 而不是 MacOSX。我对 Objective-C 还很陌生,而且我从来没有在没有自动垃圾收集的环境中开发过,所以我对此有点困惑。以下是 Apple.com 上的示例中将视图控制器分配给应用程序委托的一些有效代码:
MyViewController *aViewController = [[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
[self setMyViewController:aViewController];
[aViewController release];
所以,据我了解,我必须释放 aViewController 因为它是首先分配的(+1 = 1);然后保留在 setter 中(+1 = 2);然后在 setter 中释放(-1 = 1);然后不再需要,所以最终再次释放(-1 = 0)并释放内存。我可以不只是跳过分配临时对象 aViewController 并像这样嵌套这些函数:
[self setMyViewController:[[MyViewController alloc]
initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]];
我想知道这是否可以正常工作?我有点担心,因为 setter 需要一个指向 ViewController 的指针,而不仅仅是一个副本。而且由于我只传递一个返回值,setter 中的指向 ViewController 的指针是否会指向可能在分配之前可能被擦除或丢失的数据?如果这似乎是一个愚蠢的问题,我很抱歉,但我很难在任何地方找到答案,我正在努力为非垃圾收集环境建立良好的技术。谢谢!
【问题讨论】:
-
您应该按照 bbum 的建议发布您对
setMyViewController:的实现。您的描述“然后保留在设置器中(+1 = 2);然后在设置器中释放(-1 = 1);”听起来很可疑...... -
setter 看起来像这样:@property (nonatomic, retain) MyViewController *myViewController;
-
如果我错了,请纠正我,但我很确定会生成如下代码: - (void) setMyViewController: (MyViewController*)controller { myViewController = [controller retain]; [控制器释放]; }
标签: objective-c iphone memory-management