我有一个可靠运行的复杂应用程序,但我很疑惑为什么我需要保留一个特定的NSArray('sources')两次以防止崩溃(尽管没有报告异常控制台,但应用程序崩溃并返回跳板)。
下面包含一段代码。有太多的代码要粘贴它,但你知道没有显式调用来释放数组。 'sources'是一个实例变量。
如果我只保留一次(或根本不保留)数组,我就会崩溃。有两个保留,应用程序非常稳定。
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Sources" ofType:@"plist"];
sources = [[NSArray arrayWithContentsOfFile:plistPath] autorelease];
[sources retain];
[sources retain];
为什么我需要保留此数组两次的想法。提前谢谢。
答案 0 :(得分:10)
您正在使用+arrayWithContentsOfFile:
,它返回一个自动释放的对象,然后再次自动释放它。取出对-autorelease
的电话,你会没事的。您可以重写它:
sources = [[NSArray arrayWithContentsOfFile:plistPath] retain];
答案 1 :(得分:7)
是显式调用以释放数组。 autorelease
与release
一样明确 - 它只是稍后发生。不仅如此,首先自动释放阵列是错误的,因为你没有拥有它。声称拥有阵列的所有权需要一个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];