这句话的意思是:`IBOutlet`一词实际上没有定义任何东西。
Xcode只是在您的代码中使用此单词的存在,以便允许您在界面构建器中进行连接。将变量或属性声明为
IBOutlet
:
IBOutlet UIButton * button;
@property (...) IBOutlet UIButton * button;
因此,就ARC而言,它没有任何直接影响;它不会(虽然可能会)转换为
__weak
或类似的东西。在编译器获得源代码之前,这个单词本身已经完全消失了。
另一方面,这个变量或属性是一个outlet,确实对你需要考虑的内存管理方式有意义。
在ARC下,对象变量声明的隐式存储限定符,如
IBOutlet UIButton * button;
,是
__strong
,正如你所说 - 分配给该变量的任何对象都将被视为“拥有”。在MRR下,声明只是一个指针;分配对分配的对象的引用计数/所有权没有影响 - 它的作用方式与
assign
属性相同。因此,在两种管理系统之间,相同的ivar声明的含义发生了变化。
xib文件中的对象拥有/拥有者关系是由视图层次结构形成的;也就是说,父视图拥有其子视图。xib中的顶层视图由名为File's Owner的对象拥有。这种设置意味着,一般来说,在xib中与顶级对象无关的对象的插座应该是弱引用(在ARC下)或赋值(如果是MRR下的属性)。它们不是拥有关系;它们本质上是方便查看列表的索引。这是苹果公司的建议:
“……你不需要强引用图中较低层次的对象,因为它们是由其父级拥有的,你应该尽量减少创建强引用循环的风险。[...]Outlet 应该通常是弱引用,除了从文件所有者到 Nib 文件中的顶层对象(或在 iOS 中,是 Storyboard 场景)的 Outlet 应该是强引用。因此,你创建的 Outlet 通常默认情况下应该是弱引用......”
“像我解释过的那样,您简单的指针 IBOutlet 在内存管理方面起到了类似于弱引用属性的作用,这意味着它们正在做正确的事情。当在 ARC 下编译时,相同的声明将成为可能是错误的。”
总之:
IBOutlet
不会被翻译成
weak
,但它确实改变了指针的含义。由于在 MRR 下,
IBOutlet UIButton * button;
的默认内存管理语义从“assign”变为了 ARC 下的“owned”,而且
IBOutlet
通常应该是非拥有的,因此,
IBOutlet
的存在确实意味着指针在 ARC 下应该声明为
__weak
。
†
*和weak
属性类似——唯一的区别在于,当对象被释放时,weak
指针会被设置为nil
。
**除了自动nil
部分。
†或者说,它应该是一个weak
属性。
strong
IBOutlet
也会起作用。 - jscs