我正在使用基于ARC的项目不符合ARC的库。该库中的函数返回保留的UIImage *
对象。有没有办法使用__bridge
属性让ARC了解这一点,以便它可以管理返回对象的保留计数?我试过了:
UIImage *returnedImage;
returnedImage = (__bridge_transfer UIImage *)functionThatReturnsAUIImage();
但它不允许我将UIImage *
转换为UIImage *
)。我也尝试过:
returnedImage = (UIImage *)(__bridge_transfer void *)functionThatReturnsAUIImage();
哪个也行不通。编译器建议使用__bridge_retained
而不是__bridge_transfer
,但我相信它会与我之后的相反(即它会增加返回的UIImage
对象的保留计数)。
我认为正确的做法是让C函数返回一个自动释放的对象。据我所知,ARC假设任何返回对象的C函数都会返回一个自动释放的对象。我可以访问这个库的源代码,所以我可以这样做,但是我想知道如果我无法修改库,是否有一个我可以从调用端使用的解决方案。
答案 0 :(得分:3)
逻辑bridge
修饰符对您不起作用太糟糕了。
两种可能的方法向我跳出来。
首先,虽然它不优雅,但您可以编写自己的图像释放功能,例如:
// ImageManualMemoryManagement.h
#import <UIKit/UIKit.h>
int releaseImage(UIImage *img);
和
// ImageManualMemoryManagement.m
#import "ImageManualMemoryManagement.h"
int releaseImage(UIImage *img)
{
[img release];
return 0;
}
在项目的目标设置中,在Build Phases下,双击“Compile Sources”下的这个.m源文件,并添加非ARC标志-fno-objc-arc
(以允许您使用{{1方法)。
你现在有一个你可以调用的函数,它会减少你的UIImage的保留计数,然后再一次在世界上都很好。
其次,更为戏剧性的解决方案是在图像库呈现的整个C接口周围编写自己的非ARC包装类,从而修复那些没有返回具有正确保留计数的项目的方法。但是对于一个retainCount违规似乎很多工作。但是如果图书馆有它自己的弱点(例如你正在处理一个笨拙的低级别图书馆),你可能会一石二鸟。
答案 1 :(得分:2)
根据apple的Transitioning to ARC Release Notes,应该在这里使用__unsafe_unretained。
__ unsafe_unretained指定一个引用,该引用不会使引用的对象保持活动状态,并且在没有对该对象的强引用时不会设置为nil。如果它引用的对象被释放,则指针悬空。
由于ARC和MRC(手动引用计数)具有不同的内存管理规则,因此没有具有内存管理影响的关键字有效。唯一的选择是关键字__unsafe_unretained,它对ARC和MRC都没有内存管理影响。