我在NSManagedObjects
之一:
if (self.tempImageStorage) {
return self.tempImageStorage;
} else if(self.imageData) {
NSLog(@"%@ %d",self.imageData, self.imageData.length);
self.tempImageStorage = [UIImage imageWithData:self.imageData];
return self.tempImageStorage;
}
偶尔,通常当我快速浏览图像时,它会在第5行(UIImage imageWithData行)上以EXC_BAD_ACCESS
返回,并且我不能在控制台中使用po(printobject)self ,所以我假设NSMananagedObject
本身已被解除分配。没有意义的是它能够为2 ifs引用self,我甚至可以在它之前记录图像数据及其长度。
在此期间如何释放NSManagedObject
,因为这一切都发生在同一个线程上(并且它是主线程)?
PS:我已经启用了Zombies,但它仍然不让我自我。
设置图像数据的代码:
- (void) processRequest:(ASIHTTPRequest *) request
{
UIImage * orig = [UIImage imageWithData:[request responseData]];
CGSize targetSize = isPad()?CGSizeMake(446,150):CGSizeMake(320, 108);
CGRect fourPanelSize = CGRectMake(0, 0, 1000, 336);
CGImageRef imageRef = CGImageCreateWithImageInRect([orig CGImage], fourPanelSize);
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGColorSpaceRef colorSpaceInfo = CGImageGetColorSpace(imageRef);
if (bitmapInfo == kCGImageAlphaNone || bitmapInfo == kCGImageAlphaLast) {
bitmapInfo = kCGImageAlphaPremultipliedLast;
}
CGContextRef bitmap;
bitmap = CGBitmapContextCreate(NULL, targetSize.width, targetSize.height, CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), colorSpaceInfo, bitmapInfo);
CGContextDrawImage(bitmap, CGRectMake(1, 1, targetSize.width-2, targetSize.height-2), imageRef);
CGImageRef ref = CGBitmapContextCreateImage(bitmap);
UIImage* newImage = [UIImage imageWithCGImage:ref];
CGContextRelease(bitmap);
CGImageRelease(ref);
NSData * thumbData = UIImagePNGRepresentation(newImage);
NSData * imageData = UIImagePNGRepresentation(orig);
//Post notification on main thread since it will be updating the UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.tempImageThumbStorage = newImage;
self.imageThumbnailData = thumbData;
self.tempImageStorage = orig;
self.imageData = imageData;
[(AppDelegate*)[UIApplication sharedApplication].delegate saveContext];
NSMutableDictionary * userInfo = [[NSMutableDictionary alloc] initWithCapacity:1];
[userInfo setObject:[NSNumber numberWithBool:YES] forKey:@"status"];
[userInfo setObject:self forKey:@"comic"];
[[NSNotificationCenter defaultCenter] postNotificationName:PCRLoadMediahNotification object:self userInfo:userInfo];
strongSelf = nil;
}];
}
答案 0 :(得分:2)
原来我经常保存上下文,这导致imageData无法正确保存到磁盘,并导致异常。
答案 1 :(得分:0)
当我从互联网解析图像时,我遇到了同样的问题。那么当我在应用程序中重新创建图像时,我就像这样崩溃了:
UIImage *img = [UIImage imageWithData:imgData] -> EXC_BAD_ACCESS (code =2 0x...)
所以我的问题是我没有将此操作与主应用程序线程同步,这就是我的应用程序崩溃的原因。最奇怪的部分:模拟器在真实设备崩溃时运行良好。
要进行同步,我已添加此操作:
(void)GetImage:(NSData *)imgData number:(int)i {
[[NSOperationQueue mainQueue] addOperationWithBlock:^ { @synchronized(imgData){ // UIImage * img2 = [UIImage imageWithData:imgData]; NSLog(@"图片编号%d",i); uiimager_array [i] = [UIImage imageWithData:imgData]; } }];
}
之后我在我的循环中调用了这个void函数,现在它不会导致应用程序崩溃。 啤酒花帮助