【问题标题】:Yet another iOS memory management clarification about autorelease / release usage [duplicate]关于自动释放/释放使用的另一个 iOS 内存管理说明 [重复]
【发布时间】:2011-11-16 10:33:54
【问题描述】:

可能重复:
Is it better to autorelease or release right after?

(提前通知:请不要用ARC来讨论这个话题)

我们公司内部有一场辩论,话题是autorelease/early-release的用法。让我解释一下。

场景 1:

NSArray *tempArray = [[NSArray alloc] init];
self.myRetainingProperty = tempArray;
[tempArray release];

场景 2:

self.myRetainingProperty = [NSArray array]; // or [[[NSArray alloc] init] autorelease];

基本上这两种场景都很好,但是我很好奇社区使用这些场景的方法是什么?我更喜欢“尽快释放”(场景 1)——尤其是在内存可能很宝贵的 iOS 上,但另一方面,一个自动释放的对象(场景 2)一直存在到下一个 runloop 循环不会放太多强调内存占用。

所以我的问题是你更喜欢哪一个,或者有没有苹果推荐的方法?

再一次:请让我们暂时忽略 ARC :) ...

谢谢。

【问题讨论】:

标签: iphone objective-c ios iphone-sdk-3.0


【解决方案1】:

就内存使用而言,它们是相同的。唯一的区别是自动释放池的大小。当您将它们分配给一个属性时,当您 release 它时,该对象不会被释放,因此内存差异的差异将是在自动释放池中存储一个条目。自动释放池中有一点开销,但在这些类型的情况下,它通常可以忽略不计。您应该做一些让您感觉自然的事情,并使代码易于阅读/维护。

【讨论】:

    【解决方案2】:

    你并不经常将它用于不可变对象,但是对于 NSMutableArray 它是另一回事。

    NSMutableArray *myList = [[NSMutablearray alloc] init];
    Someobject *myObject = [[Someobject alloc] init];
    [myList addObject:myObject];
    [myObject release];
    [self setList:myList];
    [myList release];
    

    我经常像上面那样使用它。在 iPhone/iPad 上,当您的内存有限时,我认为尽快清理未使用的内存是一个好习惯。我只在没有其他选项可用时使用自动释放。

    【讨论】:

      【解决方案3】:

      如果您在运行循环中多次执行该操作,那么最好提前释放以防止建立大型自动释放池。否则,它没有任何区别,取决于个人喜好。

      我个人是早期发布阵营的,如果只是为了避免太多嵌套的方括号。

      【讨论】:

        【解决方案4】:

        基本上,这只是内存管理 :-) 和性能的问题。

        如果您要分配一个简单的对象,自动释放应该没问题。我想 1 Ko 的内存对你的应用来说应该不是很重要。

        但是...如果您分配一个占用大量内存的对象,或者分配许多占用少量内存的对象,例如在循环中,建议您尽快释放它们。否则,您可能会遇到性能问题,并且您的应用程序的 didReceiveMemoryWarning 方法(及其后果)在最好的情况下会被更频繁地调用。

        一切都取决于您想要什么样的优化:优化应用程序...或优化开发人员:-)

        【讨论】:

          猜你喜欢
          • 2011-05-14
          • 1970-01-01
          • 1970-01-01
          • 2011-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多