0

应用程序在此处崩溃,如屏幕截图所示

我在后台线程上调用一个方法..写在下面

   imageRef = assetLbraryImp.defaultRepresentation.fullResolutionImage;
   [self saveBigImageFull:imageRef withName:mediafileName addToAlbum:isFromCamera];

   -(void)saveBigImageFull:(CGImageRef)bigImage withName:(NSString*)imageName addToAlbum:   (BOOL)addToAlbum{
         bigImageFulldata = [NSArray arrayWithObjects: imageName, [NSNumber  numberWithBool:addToAlbum], nil];
[self saveBigImage:bigImageFulldata :bigImage];
 }
 -(void)saveBigImage:(id)data:(CGImageRef)imageRefere{
     _iName = (NSString *)[data objectAtIndex:0] ;
     bigImagefileName = [[NSString alloc]initWithFormat:@"%@.jpg", _iName] ;
    bigImageFilepath = [photoPath stringByAppendingPathComponent:bigImagefileName] ;
   [self savePhotoBig:imageRefere toPath:bigImageFilepath];
 }

   -(void)savePhoto:(CGImageRef)photo toPath:(NSString *)path{
       image = [UIImage imageWithCGImage:photo];
       imageData = UIImagePNGRepresentation(image);
       [imageData writeToFile:path atomically:NO];
       if(photo)
            CFRelease(photo);
   }

但是由于 CFRelease 导致应用程序崩溃。当我删除 CFRelease 时,代码工作正常。如果保存 100 张图像,则保存 100 张图像。即使在最终应用程序崩溃保存后。应用程序在进程结束时崩溃,而不是介于两者之间。

任何想法?

4

1 回答 1

0

由于 CFRelease,应用程序崩溃。当我删除 CFRelease 时,代码工作正常。

我建议检查你photo在调用的方法中做了什么savePhoto:;你photo打电话后访问savePhoto:吗?

如果我保存 100 张图像,则保存 100 张图像。即使在最终应用程序崩溃保存后。

我认为这是一个内存填充问题。使用 Instruments 的内存分配工具检查您的应用程序,以确认它由于内存填满而被终止。

编辑:

阅读上面的代码,您似乎正在保存以下图像:

imageRef = assetLbraryImp.defaultRepresentation.fullResolutionImage;

这与您稍后通过 发布的图像相同CFRelease。这里有两件事:

  1. 可能assetLibraryImp 是图像的实际所有者,所以你最好让它发布(但我无法从你的代码中判断这一点,所以你会知道的);

  2. 如果你想在 中发布savePhoto,那么我真的认为你应该使用CGImageRelease而不是CFRelease,即:

      if(photo)
           CGImageRelease(photo);
    

此外,您说您正在后台线程中执行该方法:请注意 UIKit 不是线程安全的,因此这很可能是您崩溃的原因。尝试在主线程上执行该方法(尽管它会阻塞 UI,只是为了测试),看看会发生什么。

于 2013-02-17T13:13:02.810 回答