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 失败