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

Ios NSMutableArray addObject在设备中崩溃,但在模拟器中运行正常,ios,objective-c,memory-management,memory-leaks,nsmutablearray,Ios,Objective C,Memory Management,Memory Leaks,Nsmutablearray,我的项目中有一组这样的图像 我想把它们都放到一个可变数组中,就像这样 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]] a

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

我想把它们都放到一个可变数组中,就像这样

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];
}
NSMutableArray*imageArray=[[NSMutableArray alloc]initWithCapacity:36]retain];
对于(int i=0;i<36;i++){
UIImage*image=[[UIImage ImageName:[NSString stringWithFormat:@“quicktour_u%d.JPG”,i+1]]自动释放];
[imageArray addObject:image];
}
这在模拟器中运行得很好,但在添加了5幅图像后在设备中运行时崩溃

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

谁能帮帮我吗

提前谢谢

编辑:

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

*****由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:“*-[\uu NSArrayM” insertObject:atIndex::对象不能为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:以类型为的未捕获异常终止 N例外**


根据文档,传递给
addObject:
的对象不能为零。很可能您的第五个图像的名称与您要求的大小写不匹配,
imageNamed:
调用因此返回nil。iOS文件系统区分大小写,但OSX文件系统(通常)不区分大小写;仅出现在设备上的问题通常与此相关

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

  • 您确定要添加到阵列中吗
  • 在分配任务后添加NSLog语句,它会使设备上的速度减慢一点,但是,您正在崩溃,原因可能是您没有添加任何内容,或者您正在添加不存在的内容
  • 此外,我将再次使用NSLog显示图像的路径,您可能会惊讶地发现图像不在正确的路径中
  • 现在,完全颠倒逻辑。在启用ARC的情况下,在单独的项目中尝试相同的代码。你也有同样的问题吗?如果不是,则是内存问题,即autorelease语句,因为“autorelease”仅在autorelease池的末尾起作用,因此您可能会在进行过程中堆积图像,这不是一件好事
  • 我会将您的代码更改为:

    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;
    }
    
    NSMutableArray*imageArray=[[NSMutableArray alloc]initWithCapacity:36]retain];
    对于(int i=0;i<36;i++){
    UIImage*image=[UIImage ImageName:[NSString stringWithFormat:@“quicktour_u%d.JPG”,i+1]];
    [imageArray addObject:image];
    [图片发布];
    图像=零;
    }
    
    您能提供崩溃日志吗?粘贴您的崩溃日志。我想这是因为设备内存溢出。您在运行时添加了太多内存(请检查图像大小)。您过度释放了图像(ImageName:已返回自动释放的图像,无需自动释放),并且过度保留了图像数组(init方法返回的对象的保留计数为+1,并且不会自动释放)。重新阅读Apple文档中的手动内存管理规则。关于nil问题,其他的海报可能是对的,但它对你没有任何帮助,因为在一天结束的时候,你会有一个包含垃圾值的数组。就是这样!伙计,我在拔头发。非常感谢!:)您的代码与OP的问题相同,即如果
    -imagename:
    返回nil,它将崩溃,如果请求的映像不可用,它将执行此操作。在添加到数组之前检查nil。