我在Xcode 4.5.2中有一个应用程序,我正在使用ARC。我的应用程序一直在构建和运行,没有编译器警告或错误,但是,当应用程序进入后台然后返回到前台时(特别是在延长的时间段之后),应用程序崩溃。我对iOS很新,我一直在努力分析崩溃报告,并象征崩溃,但到目前为止,我还没有成功收集任何问题的线索。然而,当我重新打开我的项目时,一行代码(一直存在)现在显示蓝色编译器警告:内存(Core Foundation / Objective C)对象的潜在泄漏。 我不明白为什么这段代码在使用ARC的情况下产生这个警告,我也不明白为什么它会突然出现。我假设这可能与崩溃问题有关,但我不知道为什么我收到此错误因此我不知道如何解决它。
以下是问题所在的代码:
- (void) cropPhoto:(UIImage *)originalImage inImageView:(UIImageView *)imageView atXPoint:(int)x atYPoint:(int)y withWidthSize:(int)width withHeightSize:(int)height
{
CGSize size = [originalImage size]; //gets size of Facebook photo
[imageView setFrame:CGRectMake(0, 0, size.width, size.height)];
[self.view addSubview:imageView]; //adds imageView to view
CGRect rect = CGRectMake (size.width / 4, size.height / 4 ,
(size.width / 1), (size.height / 2));
//THIS NEXT LINE GIVES THE COMPILER WARNING!!
[imageView setImage:[UIImage
imageWithCGImage:CGImageCreateWithImageInRect([originalImage CGImage], rect)]];
[imageView setFrame:CGRectMake(x, y, width, height)];
[self.view addSubview:imageView];
}
感谢任何帮助或指导。
答案 0 :(得分:6)
调用CGImageCreateWithImageInRect()
会返回您必须释放的对象。 (保留计数为1)
ARC不会为您处理Core Foundation对象的保留/释放。
您的代码应如下所示:
{
CGImageRef cgImage = CGImageCreateWithImageInRect([originalImage CGImage], rect)
[ imageView setImage:[ UIImage imageWithCGImage:cgImage ] ] ;
CGImageRelease( cgImage ) ;
}
编辑:
这是另一种选择:
[imageView setImage:[UIImage
imageWithCGImage:CFBridgingRelease( CGImageCreateWithImageInRect([originalImage CGImage], rect))]];