0

必须使用一个包含类指针的联合,但打开 ARC,并且在这里很好地解释:__unsafe_unretained NSString struct var you have to set the field __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

4

2 回答 2

2

最简单的方法是使用强制转换__bridgeCFRelease

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 类,这样它就可以持有强引用。

于 2012-12-29T23:18:36.700 回答
-1

我会持有一个额外的强指针,然后你就不必担心释放它。

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

FOO * foo = malloc(sizeof(FOO));
foo.__bar = myStrongBar;
... // I have fun with foo.__bar
free(foo);
于 2012-12-29T23:23:23.720 回答