内存警告/泄漏 编辑1:此问题特别发生在iOS7上。

内存警告/泄漏 编辑1:此问题特别发生在iOS7上。,ios,uiimage,core-graphics,uiimagepickercontroller,Ios,Uiimage,Core Graphics,Uiimagepickercontroller,我正在尝试使用imagePickerController方法中的一些核心图形方法裁剪已由UIImagePickerController拍摄的图像: - (void)imagePickerController:(UIImagePickerController *)photoPicker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = [info valueForKey:UIImagePicke

我正在尝试使用
imagePickerController
方法中的一些核心图形方法裁剪已由UIImagePickerController拍摄的图像:

- (void)imagePickerController:(UIImagePickerController *)photoPicker didFinishPickingMediaWithInfo:(NSDictionary *)info
{   
    UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];

    if(modeSelected == kModeTypeAutomatic){
        //cropping image
        if(image.imageOrientation == UIImageOrientationUp){
            CGImageRef tmpImgRef = [image CGImage];
            CGImageRef topImgRef = CGImageCreateWithImageInRect(tmpImgRef, CGRectMake(image.size.width/2, 0, image.size.width/2, image.size.height));
            secondImage = [UIImage imageWithCGImage:topImgRef];
            CGImageRelease(topImgRef);
        }
        else{
            CGImageRef tmpImgRef = [image CGImage];
            CGImageRef topImgRef = CGImageCreateWithImageInRect(tmpImgRef, CGRectMake(0, 0, image.size.width, image.size.height/2.0));
            secondImage = [UIImage imageWithCGImage:topImgRef scale:image.scale orientation:UIImageOrientationRight];
            CGImageRelease(topImgRef);

        }
    }

    image = nil;

    [photoPicker dismissViewControllerAnimated:NO completion:nil];

    if (secondImage) {
        [self performSegueWithIdentifier:@"SecondPicTakenSegue" sender:nil];
    }
}
我使用Instrument进行了一些分配和内存泄漏,并验证了问题出在这个方法中。 我不是在这里发布什么吗?少了什么吗? 谢谢

这可能是您的问题(从
CGImage
参考,在
CGImageCreateWithImageInRect
下):

生成的图像保留对原始图像的引用,这意味着您可以在调用此函数后释放原始图像


因此,您可能需要尝试使用
CGImageRelease(tmpImgRef)
,因为调用
CGImageCreateWithImageInRect
可能会增加引用计数。我还没有亲自测试过,以确保情况属实,但可能值得一试。

很难从代码片段中分辨出来,但
secondImage
可能是泄漏的内容。在
dealloc
方法中将其显式设置为
nil
没有害处,以查看这是否有帮助:

-(void)dealloc {
    secondImage = nil;
}

你试过使用静态分析器吗
CMD+Shift+B
仪器显示泄漏的是什么类型的物体?在这个方法中,您似乎没有释放
secondImage
,但我猜您在其他地方使用了它。@user1118321是的,我确实在它上面使用了ARC。@Sean我试过了,但没有显示任何东西。这些工具应该告诉您每个泄漏的对象是什么类型的。在窗口的下半部分,对于表中的每个条目,它应该说明其大小以及它来自哪个类。它说了什么?他没有说明如何定义
secondImage
,但他使用了ARC,因此
UIImage
通常不需要
dealoc
。他还明确地发布了为
secondImage
创建的
cgimagerf
,因此如果是这样的话,我会感到惊讶。也许另一个答案是关于某件事。
secondImage
在分配新创建的
UIImage
之前是否有任何值?您的代码中的其他地方是否可能保留了旧值的
CGImage
?嗨,Manny!否,
secondImage
是在我共享的方法中分配的。当您使用此方法时,它的值是否为
nil
?您正在对
secondImage.imageOrientation
执行检查,因此您似乎希望它有一些价值。除了确认我最初在这个答案中所写的内容外,我还将检查当点击此方法时,
secondImage
设置为什么。如果它带来了一些价值,那么我会返回并确保它的
CGImage
不应该在其他地方发布(换句话说,如果除了包装
UIImage
之外的任何东西都保留了它)。