所以是的,我是这个疯狂iPhone世界中的Java家伙。在内存管理方面,我对我正在做的事情并不十分了解。
我有一个使用导航控制器的应用程序,当需要进入下一个视图时,我的代码看起来像这样:
UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView"
bundle:[NSBundle mainBundle];
[[self navigationController] pushViewController:myController animated:YES];
现在根据Apple关于内存管理的基本规则
如果使用名称以“alloc”或“new”开头或包含“copy”的方法创建对象,则获得对象的所有权(例如,
alloc
,newObject
或{ {1}}),或者如果您发送mutableCopy
消息。您有责任使用retain
或release
放弃您拥有的对象的所有权。在收到对象的任何其他时间,您都不能释放它。
对我来说,这意味着我应该发布autorelease
,或者给它一个myController
消息。但是,每当我尝试这样做时,我的应用程序会因为我从堆栈中推送和弹出视图而崩溃。
这对我来说没有味道,但在运行仪器时它声称我没有任何内存泄漏。
所以我的问题是
答案 0 :(得分:9)
问题是(最有可能)你在导航控制器有机会声明所有权之前释放你的viewController 。有两种方法:
-release
您的控制器 将其推送到导航控制器-autorelease
您的控制器在推送之前。如果你这样做,活跃的NSAutoreleasePool(你不需要担心)将在以后释放你的控制器。答案 1 :(得分:3)
@Ben Gottlieb为什么你需要在推送前自动发布?在对象分配时保留计数为1,在推送之前或之后自动释放不影响保留计数,尽管通常自动释放作为样式的问题在对象alloc / init之后应用:
[[[object alloc] init] autorelease];
@bpapa,
2)按下时,导航控制器将保留视图控制器。稍后当导航控制器堆栈弹出此视图时,导航控制器将释放它。
3)除非有明确的理由保留该视图否则不应将其分配给实例变量。通常,只要您需要它们,您就希望您的视图存在。