【问题标题】:IOS - Unexpected Crash With No Crash InfoIOS - 没有崩溃信息的意外崩溃
【发布时间】:2013-08-02 22:01:06
【问题描述】:

我一直在多个平台上测试 IOS 应用程序,并在 iPhone 4S 上进行测试时观察到一些奇怪的行为。该应用程序在执行适用于 iPhone 5 和 iPhone 3S 的任务后崩溃。当崩溃发生时,调试器上没有任何显示,Xcode 中绝对不会出现崩溃日志或内存警告。我隔离了代码块以及导致崩溃的特定行。我仍然不明白为什么会这样或如何找到解决方案。该代码是一个更大的方法的一部分,该方法下载许多图像并将它们显示在 UIImageViews 中。代码如下:

//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];
}

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

【问题讨论】:

  • 它可能分配了太多内存,操作系统正在终止应用程序而没有警告。最近发生在我身上,没有例外,没有内存警告,它只是终止了。将 imageFile.getData 调用分隔到单独的行中,其中变量保存 NSData,然后将数据传递给 imageWithData。这将有助于找出这两种方法中的哪一种导致了问题。
  • 尝试在该循环中添加对logMemUsage() 的调用,代码为here,您可以在循环中看到释放内存的情况。

标签: iphone ios debugging crash


【解决方案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);
}

【讨论】:

  • getData: 方法来自哪个类以及如何使用它? @Wain
  • PFFile,您已经在调用 getData 方法(按点表示法)。 parse.com/docs/ios/api/Classes/PFFile.html#//api/name/getData:
  • 所以您的意思是使用[imageFile getData] 而不是imageFile.getData?很抱歉让你把它拼出来,我对此很陌生。 @Wain
  • 另外手机实际上有时也需要重启,会不会是测试手机不好? @Wain
  • 手机的某些问题可能导致下载失败...
猜你喜欢
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多