【问题标题】:__attribute__((NSObject)) auto-synthesized property doesn't get released in dealloc__attribute__((NSObject)) 自动合成的属性不会在 dealloc 中释放
【发布时间】: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


    【解决方案1】:

    ARC specification中有一个奇怪的措辞,在定义可保留对象指针时最后一种定义为:

    __attribute__((NSObject))标记的typedef

    请注意,这里使用的是 typdefs 而不是 declarations。在规范中再次使用了该措辞。这几乎似乎表明您需要使用typedef 来识别该属性,这将是一个奇怪的设计。

    不幸的是,规范中提到的属性声明(强调):

    __attribute__((NSObject)) 应用于非可保留对象指针类型的属性与在 ARC 之外的行为相同:它要求属性类型是某种指针,并允许使用除assign 之外的修饰符。这些修饰符只影响合成的 getter 和 setter;对 ivar 的直接访问(即使是合成的)仍然具有原始语义,并且 在释放期间不会自动释放 ivar 中的值

    这似乎可以解释您所看到的行为 - 设计是半生不熟的,getter/setter 采用语义但释放没有。

    鉴于规范措辞,您对自动支持的一个希望似乎是首先为 CF 类型创建一个属性 typedef,然后在属性声明中使用它……如果为真,这很奇怪,但它符合奇怪的措辞……抱歉目前无法检查,但我猜结果将是失望。尝试将nil 分配给dealloc 中的属性,因为它使用(根据规范)具有正确语义的setter。

    HTH

    【讨论】:

    • 它似乎确实适用于 typedef typedef __attribute__((NSObject)) CFArrayRef MyArrayRef; 并将 bar 定义为 MyArrayRef
    • 对您来说是个好消息,但 Apple 的想法是什么?让我们有礼貌,称其为“有趣”的语言设计。 (当您先编写编译器,然后编写规范时,可能会发生这种事情 - 使任何实现怪癖永垂不朽。但也许 Apple 有理由为好奇的语义提供理由。)
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2011-05-03
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多