内存警告/泄漏 编辑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
之外的任何东西都保留了它)。