【发布时间】:2017-09-01 04:19:23
【问题描述】:
我想要一个由强引用支持但在 ARC 中具有核心基础对象类型(不是 Objective-C 对象类型)的属性。我相信正确的方法是用__attribute__((NSObject)) 标记它,ARC 将像Objective-C 对象类型属性一样管理它(即在分配时释放和保留,并在包含对象为dealloced 时释放) :
@interface Foo : NSObject
@property (nonatomic, strong) __attribute__((NSObject)) CFArrayRef bar;
@end
@implementation Foo
// property bar is auto-synthesized
@end
(我知道CFArray 是免费桥接至NSArray。这只是为了举例。真正的用例是没有免费桥接的Core Foundation 类型。)
但是当我将一个对象放入Foo 对象的bar 属性并让Foo 对象超出范围并获取dealloced 时,bar 中的对象被泄露,因为它是释放 Foo 对象时不会释放,就像使用常规的 Objective-C 对象类型属性一样:
void someFunc(void) {
Foo *foo = [[Foo alloc] init];
CFArrayRef arr = CFArrayCreateMutable(NULL, 42, &kCFTypeArrayCallBacks);
foo.bar = arr;
CFRelease(arr);
}
代码编译时没有任何警告或错误,并且通过了分析没有任何问题。 Leaks 工具检测到可变数组已泄漏。
这是编译器错误吗?我正在使用最新的 Xcode (8.3.3)。
【问题讨论】:
标签: objective-c memory-leaks properties automatic-ref-counting core-foundation