假设weak
类似于assign
or unsafe_unretained
,除了weak
当它指向的对象被dealloc
'ed 时,变量被“归零”。但是 ARC 是由编译器处理的,那为什么weak
iOS 4 和 Mac OS X 10.6 不支持呢?
(对于这个问题,请不要猜测作为答案,但事实/参考/文档更支持的东西)
假设weak
类似于assign
or unsafe_unretained
,除了weak
当它指向的对象被dealloc
'ed 时,变量被“归零”。但是 ARC 是由编译器处理的,那为什么weak
iOS 4 和 Mac OS X 10.6 不支持呢?
(对于这个问题,请不要猜测作为答案,但事实/参考/文档更支持的东西)
由于__weak
需要在当前对象以外的地方清零一个或多个指针,因此需要额外的数据结构来跟踪弱引用。这与不需要额外跟踪的__strong
、__unsafe_unretained
和形成对比。__autoreleasing
跟踪结构和操作它们的程序内置在操作系统中;编译器插入代码来执行调用,但需要操作系统支持才能使编译后的代码工作。
__weak
引用需要运行时支持,这在较旧的 iOS 版本上不可用。
10.6 不支持弱引用没有技术原因,而且确实至少有一个第三方实现可用(例如这个)。Apple 决定支持 ARC,但没有弱引用。我怀疑任何知道Apple做出该选择的实际原因的人都可以将其发布在stackoverflow上……所以您所能做的就是推测。