【问题标题】:Memory Management Autorelease vs. Alloc Question内存管理自动释放与分配问题
【发布时间】:2010-08-14 19:08:31
【问题描述】:

3 个相关问题:

1.下面的代码sn-ps是否在内存方面提供了完全相同的结果?

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

谢谢。

【问题讨论】:

    标签: objective-c xcode memory


    【解决方案1】:
    1. 是的,从开发人员的角度来看,它们在内存管理方面应该是等效的。框架可能会在幕后做一些事情来保持[NSBundle mainBundle],但这不是你关心的问题。

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

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

    【讨论】:

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

      2. 我相信当对象被释放时,retainCount 不会改变。

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

      【讨论】:

        猜你喜欢
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 2010-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        相关资源
        最近更新 更多