编辑2(2013 年 3 月)对于那些对这项技术感兴趣的人来说,仅供参考,clang 的 ARC 文档 http://clang.llvm.org/docs/AutomaticReferenceCounting.html#retainable-object-pointers包括以下注释:
指某东西的用途__attribute__((NSObject))
不推荐使用 typedef。如果绝对有必要使用此属性,请非常明确地使用 typedef,并且不要假设它会被语言功能保留,例如__typeof
和 C++ 模板参数替换。
基本原理
任何无意中从类型中剥离类型“糖”的编译器操作都会生成没有该属性的类型,这可能会导致意外行为。
EDIT下面的内容很有趣,但可能无关紧要。这是一个错误,你应该打开雷达。正如@lnafziger 所指出的,这是合法的并且应该受到尊重。错误在于,当您包含时,它不会被遵守nonatomic
。如果您删除nonatomic
,然后就可以了。里面什么也没有nonatomic
定义表明这是设计使然。
这有点聪明,但我想我明白为什么它不起作用。顺便说一句,您可以通过生成汇编程序并注意到它无法正常工作来确认setStr:
不打电话objc_storeStrong()
。它做了一个简单的分配。
问题是您的属性定义不符合可保留对象指针的定义(添加了强调):
可保留对象指针(或可保留指针)是一个值
可保留对象指针类型(retainable type)。有三种
可保留对象指针类型的种类:
- 块指针(通过将插入符 (^) 声明符标记应用于
函数类型)
- Objective-C 对象指针(id、Class、NSFoo* 等)
-
typedefs用 __attribute__((NSObject)) 标记
您是否按照指定创建了 typedef?不,你没有。好的,那么我们该怎么做呢?
typedef __attribute__((NSObject)) CFStringRef MYStringRef;
@interface TestClass : NSObject
@property (nonatomic, strong) MYStringRef str;
@end
... the rest of your code ...
正如我假设您所期望的那样,这将打印“1”,然后打印“2”。由于未说明的原因让我感到害怕,但是查看汇编器输出,一切似乎都很好,我在这里想不出任何具体问题或违规行为。
你可能有理由为此打开雷达。 typedef 没有被视为与指定类型相同的事实至少令人惊讶,即使有记录。
EDIT:注意到 @lnafziger 的评论对象C编程语言 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html,ARC 规范/实现中肯定存在错误,或者链接文档中存在错误,因此应修复其中之一。