关于 iPhone 中的内存管理

Posted

技术标签:

【中文标题】关于 iPhone 中的内存管理【英文标题】:About memory management in iPhone 【发布时间】:2011-08-30 20:10:21 【问题描述】:

请澄清以下内容。

每个人都知道;如果我们使用allocretainnewetc...,我们必须释放它。对于剩下的事情,我们必须使用autorelease。我的疑问是;

-(NSArray*)getArray NSArray *array = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4", @"5", nil]; 返回[数组自动释放]; NSArray *arr = [self getArray]; --- ---

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 做任何事情,因为您没有在当前范围内明确地 alloccopynewretain 它。它已被添加到自动释放池中,因此在您完成后会自动清理它。

编辑:在您编辑的问题中,[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 的困惑

iphone内存管理

iphone内存管理问题

iphone(object-c) 内存管理 有效的内存管理 后半部分

关于内存管理

在循环 iphone 中创建多个标签的内存管理