__属性(NSObject))自动合成属性不';我不会被释放 我想要一个由强引用支持的属性,但在ARC中有一个核心基础对象类型(不是ObjuleC对象类型)。我认为正确的方法是使用\uuuu属性((NSObject))对其进行标记,ARC将像Objective-C对象类型属性一样对其进行管理(即分配时释放和保留,包含对象被释放时释放): (我知道 CFArray 是免费的桥接到 NSArray 。这只是为了一个例子。真正的用例是一个没有免费桥接的核心基础类型)。

__属性(NSObject))自动合成属性不';我不会被释放 我想要一个由强引用支持的属性,但在ARC中有一个核心基础对象类型(不是ObjuleC对象类型)。我认为正确的方法是使用\uuuu属性((NSObject))对其进行标记,ARC将像Objective-C对象类型属性一样对其进行管理(即分配时释放和保留,包含对象被释放时释放): (我知道 CFArray 是免费的桥接到 NSArray 。这只是为了一个例子。真正的用例是一个没有免费桥接的核心基础类型)。,objective-c,memory-leaks,properties,automatic-ref-counting,core-foundation,Objective C,Memory Leaks,Properties,Automatic Ref Counting,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 =

但是,当我将一个对象放入
Foo
对象的
bar
属性中,并让
Foo
对象超出范围并获得
dealloc
ed时,
bar
中的对象泄漏,因为当
Foo
对象被释放时,它没有被释放,与常规Objective-C对象类型属性一样:

void someFunc(void) {
  Foo *foo = [[Foo alloc] init];
  CFArrayRef arr = CFArrayCreateMutable(NULL, 42, &kCFTypeArrayCallBacks);
  foo.bar = arr;
  CFRelease(arr);
}
代码编译时没有任何警告或错误,并且通过分析时没有问题。泄漏仪器检测到可变阵列泄漏


这是一个编译器错误吗?我使用的是最新的Xcode(8.3.3)。

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

\uuuuu属性((NSObject))标记的typedefs

注意,这使用的是typdefs,而不是声明。该短语在规范中再次使用,这似乎表明您需要使用
typedef
来识别属性,这将是一个奇怪的设计

不幸的是,当涉及到属性声明时,规范会说(重点添加):

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

这似乎解释了您所看到的行为——设计是半生不熟的,getter/setter采用了语义,但deallocation没有

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


HTH

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

\uuuuu属性((NSObject))标记的typedefs

注意,这使用的是typdefs,而不是声明。该短语在规范中再次使用,这似乎表明您需要使用
typedef
来识别属性,这将是一个奇怪的设计

不幸的是,当涉及到属性声明时,规范会说(重点添加):

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

这似乎解释了您所看到的行为——设计是半生不熟的,getter/setter采用了语义,但deallocation没有

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


HTH

它似乎与typedef
typedef_uuu属性_uuu((NSObject))CFArrayRef MyArrayRef一起工作
并将
bar
定义为
MyArrayRef
对你来说是个好消息,但苹果当时在想什么呢?让我们礼貌一点,称之为“有趣”的语言设计。(当你先编写编译器,然后编写规范时,这种事情可能会发生——使任何实现怪癖永垂不朽。但也许苹果公司有理由解释这种奇怪的语义。)它似乎确实适用于typedef
typedef_u属性(NSObject))CFArrayRef MyArrayRef
并将
bar
定义为
MyArrayRef
对你来说是个好消息,但苹果当时在想什么呢?让我们礼貌一点,称之为“有趣”的语言设计。(当你先编写编译器,然后编写规范时,这种事情可能会发生——使任何实现怪癖永垂不朽。但也许苹果有理由解释这种奇怪的语义。)
void someFunc(void) {
  Foo *foo = [[Foo alloc] init];
  CFArrayRef arr = CFArrayCreateMutable(NULL, 42, &kCFTypeArrayCallBacks);
  foo.bar = arr;
  CFRelease(arr);
}