关于 iPhone 中的内存管理
Posted
技术标签:
【中文标题】关于 iPhone 中的内存管理【英文标题】:About memory management in iPhone 【发布时间】:2011-08-30 20:10:21 【问题描述】:请澄清以下内容。
每个人都知道;如果我们使用alloc
、retain
、new
和etc...
,我们必须释放它。对于剩下的事情,我们必须使用autorelease
。我的疑问是;
arr
我们要做什么?
编辑:
NSString *str = [NSString stringWithFormat:@"Welcome..."];
如果我们使用上面的语句,我们应该调用autorelease
。但我想知道,stringWithFormat:
method 中发生了什么。它如何返回NSString
。
谢谢。
【问题讨论】:
向我们展示将使用 arr 的其余代码实际上非常重要。如果都在你调用 getArray 的同一个方法中,那么你根本不需要做任何事情。 附带说明,根据命名约定,前缀“get”仅用于间接返回对象的方法。 我在下面添加了关于 [NSString stringWithFormat:] 的问题的答案。 【参考方案1】:如果您打算返回数组,请继续使用 [NSArray arrayWithObjects:@"1", @"2", etc, nil]。
然后你只需要记住保留它,如果你想持有它更长的时间,那么自动释放池就会持有它。
自动释放池将保留计数为 1,然后在调用释放池时自动将其减 1。如果不保留在调用函数中,这个对象最终会消失。
【讨论】:
arrayWithObjects: 方法中发生了什么?我要求 stringWithFormat: 的同样的事情。已经在返回对象的时候使用了 autorelease,那为什么还要使用 autorelease 呢?【参考方案2】:您不必对 arr 做任何事情,因为您没有在当前范围内明确地 alloc
、copy
、new
或 retain
它。它已被添加到自动释放池中,因此在您完成后会自动清理它。
编辑:在您编辑的问题中,[NSString stringWithFormat:]
返回一个自动释放的字符串。它基本上与您在 getArray 方法中所做的事情相同。它构建一个 NSString(或相关)对象并在返回之前自动释放它。
【讨论】:
如果它返回一个自动释放的字符串意味着,我们再次不需要使用自动释放。对 ?为什么人们说我们应该对返回的字符串使用 autorelease 方法?请澄清这一点。【参考方案3】:你应该保留:
[[self getArray] retain];
或者在getArray
中返回非自动释放的对象。
【讨论】:
【参考方案4】:您的 getArray 方法返回一个 NSArray,当堆栈完全展开时_will_be_ 释放该 NSArray。
在调用 getArray 方法的方法中,使用 NSArray 是安全的,但如果要保留它,并在当前方法返回后使用它,则需要使用 [arr retain 保留 NSArray ].
回答您的新问题
类方法,如 [NSString stringWithFormat:] 或 [NSURL URLWithString:] 返回已自动释放的对象。这是一种约定,是 UIKit 和 Apple 框架中的标准做法。
【讨论】:
正确。如果你从 [NSString stringWithFormat:] 得到一个对象,你不需要释放它。以上是关于关于 iPhone 中的内存管理的主要内容,如果未能解决你的问题,请参考以下文章
iPhone:关于 NSAutoreleasePool 的困惑