内存管理自动释放与Alloc问题

时间:2010-08-14 19:08:31

标签: objective-c xcode memory

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获得所有权?

感谢。

2 个答案:

答案 0 :(得分:3)

  1. 是的,从开发人员的角度来看,这些在内存管理方面应该是等效的。框架可能会在场景后面做一些事情来挂起[NSBundle mainBundle],但这不是你的问题。

  2. 忽略retainCount挥手这不是你要找的方法。一旦放弃了对象的所有权,通过调用releaseautorelease,那么向该对象发送更多消息是无效的(不良做法)。在您的示例中,您allocNSBundle,因此您拥有它。这意味着它有+1保留计数(我说+1,因为它是相对的)。当你发布捆绑包时,它现在有一个“0”保留计数,这意味着你不再拥有这个对象(尽管它是否仍然存在于内存中),这意味着你应该发送给你的消息,在你面前爆炸的惩罚下。

  3. 建议使用适合的情况。如果您只需要一个临时对象,那么使用返回自动释放对象的类方法可能会很好。如果您在使用对象时需要绝对确定对象不会消失,那么您可以使用alloc / init方法(或retain自动释放对象),然后在你完成后只需release

答案 1 :(得分:1)

  1. 在第二个示例中,您将创建一个额外的对象(NSAutorealeasePool),因此两者在内存方面 完全相同。但是在代码运行之后我相信内存将在两个示例中返回到相同的状态。我不太确定,但我相信在第二个例子中bundle是一个自动释放的对象,所以当池被耗尽时它会被释放。

  2. 我相信当对象被dealloc'ed时,retainCount不会被更改。

  3. 通常建议在创建大量临时对象时避免使用类方法,因为在调用下一个AutoreleasePool引脚之前它们不会被释放(并且如果你的方法中没有AutoreleasePool它在你从你的方法返回之前不会发生 - 也许甚至更晚。否则你应该使用对你感觉更好的那个。我个人更喜欢分配它们。同样重要的是要记住,如果你想要自动释放的对象(从类方法返回的对象),即使你从函数返回后仍然保留它。