NSDATA writeToFile 无故崩溃

Posted

技术标签:

【中文标题】NSDATA writeToFile 无故崩溃【英文标题】:NSDATA writeToFile crashes without a reason 【发布时间】:2011-08-02 23:36:53 【问题描述】:

我正在使用 NSDATA 从 url 下载图像并将它们保存到本地文件系统使用

NSData *dataForStorage = [NSData dataWithData:UIImagePNGRepresentation(img)];


    BOOL saveResult=[ dataForStorage writeToFile:jpegFilePath options:NSDataWritingAtomic error:&error];
    NSLog(@"Write returned error: %@", [error localizedDescription]);

我的应用程序随机崩溃,甚至没有给出消息,但保存了一些文件(再次随机)。当我在调试模式下运行应用程序时,我经常看到“EXC_BAD_ACCESS”,但继续执行成功保存了一些文件。

这段代码在后台执行:

[self performSelectorInBackground:@selector(loadImageInBackground:) withObject:arr];

请提出建议。

【问题讨论】:

能否贴出崩溃日志和控制台日志? ios 上的 iPhone 应用还是 MacOS 上的 Mac 应用? 这是 iPad 应用程序。这是控制台日志:2011-04-11 16:36:59.784 AJiPadPhotos[5881:7203] *** __NSAutoreleaseNoPool(): NSHTTPURLResponse 类的对象 0x4e222c0 自动释放,没有适当的池 - 只是泄漏 2011-04-11 16: 36:59.784 AJiPadPhotos[5881:7203] *** __NSAutoreleaseNoPool(): __NSCFData 类的对象 0x4b41c80 在没有池的情况下自动释放 - 只是泄漏 2011-04-11 16:36:59.785 AJiPadPhotos[5881:7203] *** __NSAutoreleaseNoPool (): NSConcreteData 类的对象 0x4e23ba0 自动释放,没有适当的池 - 只是泄漏 @Monica,如果它崩溃了,你应该得到一个堆栈跟踪。 @Twelve47,它甚至没有反映错误......没有堆栈跟踪......任何线索可能是问题所在? 【参考方案1】:

您的代码中的一个问题是,您在没有自动释放池的线程中运行代码,但正在使用需要自动释放池的函数。将以下代码放入 loadImageInBackground 方法中:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// existing code

[pool drain];

这可能只是几个问题之一。如需进一步帮助,我们需要查看崩溃的堆栈跟踪。

【讨论】:

您好 Codo,感谢您的回复。我已经有了这些,为了简洁起见,我只是在这里排除了它们。还有什么可以做的吗? 是的,将崩溃的堆栈跟踪添加到问题中。【参考方案2】:

只是一个疯狂的猜测:arr 是一个自动释放的对象,因此,有时它会在您的选择器被调用之前被释放。尝试使用[arr copy] 并在保存后释放它。

【讨论】:

各种 performSelector 方法中的 withObject: 参数都是为你保留的,所以我不认为这是一个问题。 谢谢@Marcelo,但这并没有帮助:(还有其他想法吗?【参考方案3】:

我遇到了完全相同的问题,但事实证明问题出在其他问题上:我的 URL 过早发布。最后,这就是我所做的并且成功了:

我打了这个电话:

[self performSelectorInBackground:@selector(downloadData:) withObject:nil];

这就是方法:

// URL - (NSString) URL for file
// filePath - (NSString) save location on device
-(void)download:(NSString *)URL

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]];
    [data writeToFile:filePath atomically:YES];
    [pool release];

所以我认为您的下载代码是正确的,但是还有一些其他变量会提前释放(可能是您的路径)。

希望这会有所帮助!我知道此页面上的其他答案对我有用。

【讨论】:

以上是关于NSDATA writeToFile 无故崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NSData writeToFile 返回 NO 没有任何错误

通过共享扩展从图库中保存照片时 NSData WriteToFile 失败

writeToFile 崩溃

ios 调用writeToFile将图片保存到本地一直失败的解决方案

NSData - 写入临时文件/目录

模拟器中的 iOS 8 writeToFile