我即将结束我的第一个应用程序,我试图通过我的错误和内存管理,并清理一切。
在xcode中的分析器中,以下行显示为“潜在的内存泄漏”
- (NSMutableArray *) convertStringToASCIIMutableArray:(NSString *)stringIn {
NSLog(@"call:convertStringToASCIIMutableArray");
NSMutableArray *arrayOut = [[NSMutableArray alloc] initWithCapacity:stringIn.length];
//NSMutableArray *arrayOut = [NSMutableArray arrayWithCapacity:stringIn.length];
for (int i=0; i<stringIn.length; i++) {
unichar ch = [stringIn characterAtIndex:i];
if (ch > 96 && ch<123) ch = ch - 32; // convert to all capitals
[arrayOut insertObject:[NSNumber numberWithChar:ch] atIndex:i];
}
return arrayOut;
}
但是当我删除alloc调用时(如在注释行中或使用autorelease),应用程序崩溃了。有谁知道这里发生了什么?
答案 0 :(得分:0)
“arrayOut”不会自动释放。
将return arrayOut
更改为return [arrayOut autorelease]
,阵列将在当前runloop结束时释放。
答案 1 :(得分:0)
这里没有看到任何东西。之所以存在“潜在泄漏”,是因为您使用alloc-init创建可变数组,而在方法完成时不释放它。由于您要返回该对象,我建议您创建一个自动释放版本。
现在,当使用自动释放版本时应用程序崩溃,您将不得不查看它崩溃的位置以及导致崩溃的情况。您是否知道在引发异常时设置断点?如果没有,请按照此操作,当崩溃发生时代码将停在该行,以便您可以调试它:
答案 2 :(得分:0)
嗯,我本身并没有真正解决我的问题,但我将我的项目转换为使用新的自动引用计数编译(ARC,感谢@Kurt Revis和@Byron将此功能引起我的注意)
要转换我的项目,我只是去编辑&gt;重构&gt;转换为Obj-C ARC。然后,我必须按照重构窗口中显示的“检查”后的提示符合新的内存管理规则。基本上我必须在我的dealloc方法中删除一些版本,但它在问题导航器中提出了一些警告,告诉我该怎么做。
ARC似乎很棒。更多信息请点击此处: