NSMutableArray addObject在设备中崩溃,但在模拟器中运行正常

时间:2014-02-05 13:36:45

标签: ios objective-c memory-management memory-leaks nsmutablearray

我的项目中有一组像这样的图像,

enter image description here

我正试图将它们全部放入一个可变数组中,就像这样,

NSMutableArray *imageArray = [[[NSMutableArray alloc] initWithCapacity:36] retain];
for (int i = 0; i < 36; i++) {
    UIImage *image = [[UIImage imageNamed:[NSString stringWithFormat:@"quicktour_%d.JPG",i+1]] autorelease];
    [imageArray addObject:image];
}

这在模拟器中运行得很好,但在添加5张图像后在设备中运行时会崩溃。

这是一个非ARC项目。我在SO上经历了所有类似的问题并尝试了那里发布的解决方案,但我的问题仍然存在。

有人可以帮帮我吗?

提前致谢。

编辑:

这是崩溃时在控制台中显示的输出。

  

*****由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' * - [__ NSArrayM   insertObject:atIndex:]:object不能为nil'   * 第一次抛出调用堆栈:(0x2f784f4b 0x39bc56af 0x2f6bec81 0x138987 0x31f2c713 0x31f2c6b3 0x31f2c691 0x31f1811f 0x31f2c107 0x31f2bdd9   0x31f26e65 0x31efc79d 0x31efafa3 0x2f750183 0x2f74f653 0x2f74de47   0x2f6b8c27 0x2f6b8a0b 0x343df283 0x31f5c049 0x1f9ab 0x3a0cdab7)   libc ++ abi.dylib:以未捕获的类型异常终止   NSException **

2 个答案:

答案 0 :(得分:3)

根据文档,传递给addObject: 的对象不得为nil 。机会是您的第五个图像被命名为大写与您要求的大小不匹配,因此imageNamed:调用返回nil。 iOS文件系统区分大小写,但OS X文件系统(通常)不是;只出现在设备上的问题通常与这一事实有关。

您可以修复文件名以防止崩溃,但在将对象添加到阵列之前,您应该确实将代码检查为nil。

答案 1 :(得分:1)

  1. 您确定要添加到阵列吗?
  2. 在你的任务之后添加一个NSLog语句,它会在设备上慢一点,但是,你正在崩溃,因为你没有添加任何东西,或者你正在添加一些不存在的东西
  3. 此外,我会再次使用NSLog来显示图像的路径,您可能会惊讶地发现图像不在正确的路径中
  4. 现在,完全逆转逻辑。在启用ARC的单独项目中尝试相同的代码。你有同样的问题吗?如果没有,这是一个内存问题,即自动释放语句,因为“autorelease”仅在自动释放池的末尾起作用,所以你很可能在你进行时堆积图像,这不是一件好事。
  5. 我会将您的代码更改为:

    NSMutableArray *imageArray = [[[NSMutableArray alloc] initWithCapacity:36] retain];
    for (int i = 0; i < 36; i++) {
        UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"quicktour_%d.JPG",i+1]];
        [imageArray addObject:image];
        [image release];
        image = nil;
    }
    
相关问题