2013-08-01 50 views
0

我一直在多个平台上测试IOS应用程序,并在iPhone 4S上测试时观察到一些奇怪的行为。在执行适用于iPhone 5和iPhone 3S的任务后,该应用程序崩溃。发生崩溃时,调试器上不显示任何内容,绝对不会在Xcode中出现崩溃日志或内存警告。我隔离了代码块和负责崩溃的特定行。我仍然不明白为什么会发生,或者如何找到解决方案。该代码是下载大量图像并将其显示在UIImageView中的更大方法的一部分。代码如下:IOS - 意外崩溃,无崩溃信息

//fill image tiles with images 
for (int i = 0; i < [objects count]; ++i) 
{ 
    PFObject *imageObject = [objects objectAtIndex:i]; 
    PFFile *imageFile = (PFFile *)[imageObject objectForKey:@"image"]; 
    UIImageView *imageHolder = (UIImageView *)[self.view viewWithTag:(100 + i)]; 

    imageHolder.image = [UIImage imageWithData:imageFile.getData]; 
} 

代码循环遍历一个已经从服务器加载图像文件的对象。每个图像要分配给的UIImageView都被标记为100 - 104,因此可以使用循环索引变量来访问它们。行UIImageView *imageHolder = (UIImageView *)[self.view viewWithTag:(100 + i)]从主视图中提取UIImageViews。在下一行中,imageHolder视图被分配了一个图像,这是导致崩溃的行,并且在注释时视图加载没有失败。我无法确定这是为什么发生,或者它是没有正确设置的imageFile或imageHolder视图。也许这里的某个人可以解释一下这个问题。

+0

它可以被分配太多的内存和操作系统被终止应用程序没有任何警告。最近发生在我身上的,没有例外,没有记忆警告,它只是终止。将'imageFile.getData'单独调用到一个单独的行上,其中包含一个保存'NSData'的变量,然后将数据传递给'imageWithData'。这将有助于找出哪两种方法导致问题。 – progrmr

+0

尝试在该循环中添加一个对'logMemUsage()'的调用,代码为[here](http://stackoverflow.com/a/2921725/1693173),你可以看到你如何释放内存经过循环。 – progrmr

回答

1

您应该对imageFile.getData有一些保护,因为它可能会返回nil。您最好使用getData:方法,该方法返回一个错误,如果无法访问数据,则可以使用该错误。


NSError *error = nil; 
NSData *imageData = [imageFile getData:&error]; 

if (imageData != nil) { 
    imageHolder.image = [UIImage imageWithData:imageData]; 
} else { 
    NSLog(@"OMG!! %@", error); 
} 
+0

getData:'方法的类是什么,它是如何使用的? @Wain – ScottOBot

+0

'PFFile',你已经调用了'getData'方法(通过点符号)。 https://www.parse.com/docs/ios/api/Classes/PFFile.html#//api/name/getData: – Wain

+0

所以你的意思是使用'[imageFile getData]'而不是'imageFile.getData'?对不起,让你拼出来,我相对新的这一点。 @Wain – ScottOBot