我必须使用包含类指针的联合,但启用了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我不能再调用release
或autorelease
了吗?
答案 0 :(得分:2)
最简单的方法是使用__bridge
演员和CFRelease
:
CFRelease((__bridge void *)foo->__bar);
其他一些说明:
请勿使用名称__char
,__array
和__bar
。所有以两个连续下划线开头的标识符都由C标准保留。
您需要在创建对象之前保留对象,因为在该语句结束时,ARC将释放它。最简单的方法是滥用CFBridgingRetain
:
foo->__bar = (__bridge id)CFBridgingRetain([[NSObject alloc] init]);
您最好只需将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);