bpa*_*apa 6 iphone cocoa-touch memory-management
所以,是的,我是这个疯狂的iPhone世界中的Java家伙.在内存管理方面,我对我正在做的事情并不十分了解.
我有一个使用导航控制器的应用程序,当需要继续下一个视图时,我的代码如下所示:
UIViewController *myController = [[MyViewController alloc] initWithNibName:@"MyView"
bundle:[NSBundle mainBundle];
[[self navigationController] pushViewController:myController animated:YES];
Run Code Online (Sandbox Code Playgroud)
现在根据Apple关于内存管理的基本规则
如果使用名称以"黄金"或"新",或包含"复制"的方法创建它,你需要一个对象的所有权(例如
alloc
,newObject
或mutableCopy
),或者如果你发送一个retain
消息.您有责任放弃使用release
或拥有的对象的所有权autorelease
.在收到对象的任何其他时间,您不得释放它.
对我来说,这意味着我应该发布myController
或给它一个autorelease
消息.但是,每当我尝试这样做时,我的应用程序会因为我从堆栈中推送和弹出视图而崩溃.
这对我来说没有味道,但在运行仪器时,它声称我没有任何内存泄漏.
所以我的问题是
问题是(很可能)您在导航控制器有机会声明所有权之前释放了您的viewController .有两种方法:
-release
您的控制器后,按向导航控制器-autorelease
你的控制器在推动之前.如果您这样做,活动的NSAutoreleasePool(您不必担心)将在以后释放您的控制器.@Ben Gottlieb 为什么你需要在推送之前自动释放?对象分配时的保留计数为 1,推送之前或之后的自动释放不会影响保留计数,尽管通常在对象分配/初始化之后应用自动释放作为样式问题:
[[[object alloc] init] autorelease];
Run Code Online (Sandbox Code Playgroud)
@bpapa,
2)推送时,导航控制器将保留视图控制器。稍后,当该视图从导航控制器堆栈中弹出时,导航控制器将释放它。
3)除非有明确的理由保留该视图,否则您不应该将其分配给实例变量。一般来说,您希望您的视图仅在您需要时才存在。
归档时间: |
|
查看次数: |
4380 次 |
最近记录: |