IBOutlet这个词实际上定义为空:
#define IBOutlet
Xcode 只是在你的代码中使用这个词的存在来允许你在 Interface Builder 中建立连接。将变量或属性声明为IBOutlet:
IBOutlet UIButton * button;
@property (...) IBOutlet UIButton * button;
因此就 ARC 而言没有任何直接影响;它不会(尽管可以想象,它可以)翻译成__weak 或类似的东西。当编译器得到它时,这个词本身已经完全从你的源代码中消失了。
另一方面,这个变量或属性是一个出口这一事实确实对您需要考虑内存管理的方式产生有意义的影响。 p>
如您所说,ARC 下 IBOutlet UIButton * button; 等对象变量声明的隐式存储限定符是 __strong - 分配给该变量的任何对象都将被视为“拥有”。在 MRR 下,声明只是一个指针;分配 to 对分配对象的引用计数/所有权没有影响——它的行为方式与 assign 属性相同。* 因此,相同 ivar 声明的含义在两个管理系统之间会发生变化。
xib 中的对象具有由视图层次结构形成的拥有/所有者关系;也就是说,父视图拥有它们的子视图。 xib 中的顶级视图由称为文件所有者的对象拥有。这种设置意味着,一般来说,您对 xib 中 非 顶级对象的出口应该是 weak(在 ARC 下)或 assign(如果是 MRR 下的属性)。他们不拥有关系;它们本质上是视图列表中的方便索引。这是Apple's recommendation:
...您不需要对图中下方的对象进行强引用,因为它们归其父级所有,您应该尽量减少创建强引用循环的风险。
[...]Outlets 通常应该是weak,除了从文件所有者到 nib 文件(或者,在 iOS 中,故事板场景)中的顶级对象应该是 strong。您创建的 Outlets 应该 [sic] 因此默认情况下通常是 weak...
您的简单指针IBOutlets,正如我所解释的那样——出于内存管理的目的——就像weak 属性一样,**这意味着他们正在做正确的事情。在 ARC 下编译时,相同的声明可能是错误的。
总结:IBOutlet 不会翻译成weak,但它确实改变了指针的含义。由于IBOutlet UIButton * button; 的默认内存管理语义从 MRR 下的“assign”变为 ARC 下的“owned”,并且由于IBOutlets 通常应该是非拥有的,IBOutlet 的存在确实暗示 指针应在 ARC 下声明为 __weak。†
*与weak 属性类似——唯一的区别是当对象被释放时,weak 指针被设置为nil。
**auto-nil 部分除外。
†或者,真的,它应该是weak 属性。