NSDATA writeToFile没有任何理由崩溃

时间:2011-04-11 11:01:14

标签: objective-c ipad crash nsdata writetofile

我正在使用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];

请建议。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

// existing code

[pool drain];

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

答案 2 :(得分:0)

我遇到了同样的问题,但事实证明问题还有其他问题:我的网址过早发布了。最后这就是我所做的并且有效:

我打了这个电话:

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

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

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