什么可能导致[UIImage imageWithData]在它返回时崩溃

时间:2012-01-07 18:17:29

标签: iphone ios core-data uiimage exc-bad-access

我在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;
    }];

}

2 个答案:

答案 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函数,现在它不会导致应用程序崩溃。 啤酒花帮助