需要保留两次NSArray以避免崩溃 - 为什么?

时间:2010-11-03 00:10:05

标签: iphone objective-c

我有一个可靠运行的复杂应用程序,但我很疑惑为什么我需要保留一个特定的NSArray('sources')两次以防止崩溃(尽管没有报告异常控制台,但应用程序崩溃并返回跳板)。

下面包含一段代码。有太多的代码要粘贴它,但你知道没有显式调用来释放数组。 'sources'是一个实例变量。

如果我只保留一次(或根本不保留)数组,我就会崩溃。有两个保留,应用程序非常稳定。

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Sources" ofType:@"plist"];

sources  = [[NSArray arrayWithContentsOfFile:plistPath] autorelease];

[sources retain];
[sources retain];

为什么我需要保留此数组两次的想法。提前谢谢。

6 个答案:

答案 0 :(得分:10)

您正在使用+arrayWithContentsOfFile:,它返回一个自动释放的对象,然后再次自动释放它。取出对-autorelease的电话,你会没事的。您可以重写它:

sources  = [[NSArray arrayWithContentsOfFile:plistPath] retain];

答案 1 :(得分:7)

显式调用以释放数组。 autoreleaserelease一样明确 - 它只是稍后发生。不仅如此,首先自动释放阵列是错误的,因为你没有拥有它。声称拥有阵列的所有权需要一个retain。第二个是通过平衡错误使用autorelease来防止崩溃。

答案 2 :(得分:3)

这与自动释放有关吗?我不明白为什么会这样:它应该是自动释放的工厂方法。虽然我不知道添加额外自动释放的后果是什么,但如果你把它与其中一个保留一起拿出来,可能值得一看。

答案 3 :(得分:3)

在工厂方法中抛弃自动释放。这就是你需要第二次保留的原因。

答案 4 :(得分:2)

那是因为arrayWithContentsOfFile:给你返回一个自动释放的数组。在此数组上调用autorelease将在当前事件运行循环结束时释放它两次。

答案 5 :(得分:1)

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Sources" ofType:@"plist"];

sources  = [[NSArray alloc] initWithContentsOfFile:plistPath];