3个相关问题:
1.下面的代码片段在内存方面是否提供了相同的结果?
NSBundle *bundle=[[NSBundle alloc] init];
[bundle release];
bundle=nil;
和
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
NSBundle *bundle=[NSBundle mainBundle];
[pool drain];
pool=nil;
bundle=nil;
2.为什么
NSBundle *bundle=[[NSBundle alloc] init];
[bundle release];
bundle的retainCount是1,而不是0?
3.建议使用哪种方法:始终使用类方法,或者始终使用alloc获得所有权?
感谢。
答案 0 :(得分:3)
是的,从开发人员的角度来看,这些在内存管理方面应该是等效的。框架可能会在场景后面做一些事情来挂起[NSBundle mainBundle]
,但这不是你的问题。
忽略retainCount
。 挥手这不是你要找的方法。一旦放弃了对象的所有权,通过调用release
或autorelease
,那么向该对象发送更多消息是无效的(不良做法)。在您的示例中,您alloc
和NSBundle
,因此您拥有它。这意味着它有+1保留计数(我说+1,因为它是相对的)。当你发布捆绑包时,它现在有一个“0”保留计数,这意味着你不再拥有这个对象(尽管它是否仍然存在于内存中),这意味着你应该不发送给你的消息,在你面前爆炸的惩罚下。
建议使用适合的情况。如果您只需要一个临时对象,那么使用返回自动释放对象的类方法可能会很好。如果您在使用对象时需要绝对确定对象不会消失,那么您可以使用alloc
/ init
方法(或retain
自动释放对象),然后在你完成后只需release
。
答案 1 :(得分:1)
在第二个示例中,您将创建一个额外的对象(NSAutorealeasePool),因此两者在内存方面 完全相同。但是在代码运行之后我相信内存将在两个示例中返回到相同的状态。我不太确定,但我相信在第二个例子中bundle
是一个自动释放的对象,所以当池被耗尽时它会被释放。
我相信当对象被dealloc'ed时,retainCount不会被更改。
通常建议在创建大量临时对象时避免使用类方法,因为在调用下一个AutoreleasePool引脚之前它们不会被释放(并且如果你的方法中没有AutoreleasePool它在你从你的方法返回之前不会发生 - 也许甚至更晚。否则你应该使用对你感觉更好的那个。我个人更喜欢分配它们。同样重要的是要记住,如果你想要自动释放的对象(从类方法返回的对象),即使你从函数返回后仍然保留它。