2

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

请建议。

4

3 回答 3

2

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

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

// existing code

[pool drain];

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

于 2011-04-12T08:55:44.220 回答
1

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

于 2011-04-11T12:25:23.493 回答
0

我遇到了完全相同的问题,但事实证明问题出在其他问题上:我的 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];
}

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

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

于 2011-05-18T17:59:01.970 回答