从ARC方法释放一个对象,该方法调用无弧C函数

时间:2012-06-19 16:18:00

标签: objective-c ios automatic-ref-counting

我正在使用基于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函数都会返回一个自动释放的对象。我可以访问这个库的源代码,所以我可以这样做,但是我想知道如果我无法修改库,是否有一个我可以从调用端使用的解决方案。

2 个答案:

答案 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都没有内存管理影响。

相关问题