__unsafe_unretained并使用ARC发布

时间:2012-12-29 23:09:22

标签: objective-c memory-management automatic-ref-counting

必须使用包含类指针的联合,但启用了ARC,并在此处详细解释:__unsafe_unretained NSString struct var您必须设置字段__unsafe_unretained

这意味着,如果我理解得很清楚,你必须管理自己的生命周期。

例如:

typedef union FOO {
    char                                    __char;
    __unsafe_unretained NSMutableArray *    __array;
    __unsafe_unretained BarClass *          __bar;
}

如果我这样做:

FOO * foo = malloc(sizeof(FOO));
foo.__bar = [[BarClass alloc] init];
... // I have fun with foo.__bar
[foo.__bar release] // this was before ARC and does not work anymore
free(foo);

如何发布foo.__bar?因为使用ARC我不能再调用releaseautorelease了吗?

2 个答案:

答案 0 :(得分:2)

最简单的方法是使用__bridge演员和CFRelease

CFRelease((__bridge void *)foo->__bar);

其他一些说明:

  1. 请勿使用名称__char__array__bar。所有以两个连续下划线开头的标识符都由C标准保留。

  2. 您需要在创建对象之前保留对象,因为在该语句结束时,ARC将释放它。最简单的方法是滥用CFBridgingRetain

    foo->__bar = (__bridge id)CFBridgingRetain([[NSObject alloc] init]);
    
  3. 您最好只需将FOO转换为Objective-C类,以便它可以保留强引用。

答案 1 :(得分:-1)

我会对它持一个强大的指针,然后你不必担心释放它。

BarClass *myStrongBar = [[BarClass alloc] init];

FOO * foo = malloc(sizeof(FOO));
foo.__bar = myStrongBar;
... // I have fun with foo.__bar
free(foo);