首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSDATA writeToFile无故崩溃

NSDATA writeToFile无故崩溃
EN

Stack Overflow用户
提问于 2011-04-11 19:01:14
回答 3查看 2.4K关注 0票数 2

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

代码语言:javascript
复制
NSData *dataForStorage = [NSData dataWithData:UIImagePNGRepresentation(img)];


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

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

这段代码是在后台执行的:

代码语言:javascript
复制
[self performSelectorInBackground:@selector(loadImageInBackground:) withObject:arr];

请提个建议。

EN

回答 3

Stack Overflow用户

发布于 2011-04-12 16:55:44

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

代码语言:javascript
复制
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// existing code

[pool drain];

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

票数 2
EN

Stack Overflow用户

发布于 2011-04-11 20:25:23

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

票数 1
EN

Stack Overflow用户

发布于 2011-05-19 01:59:02

我也遇到了同样的问题,但问题出在别的地方:我的URL过早地被释放了。最后,这就是我所做的,它起作用了:

我打了这个电话:

代码语言:javascript
复制
[self performSelectorInBackground:@selector(downloadData:) withObject:nil];

这就是方法:

代码语言:javascript
复制
// 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];
}

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5620354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档