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

Sni*_*ips 1 iphone objective-c

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

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

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

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

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

[sources retain];
[sources retain];
Run Code Online (Sandbox Code Playgroud)

关于为什么我需要两次保留这个阵列的想法.提前致谢.

Jef*_*ley 10

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

sources  = [[NSArray arrayWithContentsOfFile:plistPath] retain];
Run Code Online (Sandbox Code Playgroud)


Chu*_*uck 7

这里显式调用释放阵列.autorelease同样明确release- 它只是稍后发生.不仅如此,首先自动释放阵列是错误的,因为你没有拥有它.一retain权利要求所述阵列的所有权是必要的.第二个通过平衡不正确的使用来防止崩溃autorelease.