所以,如果我在ARC下做同样的事情(即IBOutlet UIButton *按钮;),这是否意味着按钮是一个强大的参考?或者我是否必须将其定义为弱?
简而言之,IBOutlet是否意味着__weak?
解决方法
#define IBOutlet
Xcode只是在代码中使用了这个单词,以便您在Interface Builder中建立连接.将变量或属性声明为IBOutlet:
IBOutlet UIButton * button; @property (...) IBOutlet UIButton * button;
因此,就ARC而言,没有任何直接影响;它(虽然,可以想象,它可以)转化为__weak或类似的东西.在编译器得到它之前,这个词本身就完全从你的源代码中消失了.
另一方面,这个变量或属性是一个插座的事实确实会对你需要如何考虑内存管理产生有意义的影响.
IBOutlet UIButton *按钮等对象变量声明的隐式存储限定符;如你所说,在ARC下是__strong – 分配给变量的任何对象都将被视为“拥有”.在MRR下,声明只是一个指针;赋值对指定对象的引用计数/所有权没有影响 – 它的作用方式与赋值属性相同.*因此,同一ivar声明的含义在两个管理系统之间发生变化.
xib中的对象拥有由视图层次结构形成的所有者/所有者关系;也就是说,父视图拥有自己的子视图. xib中的顶级视图由称为文件所有者的对象拥有.这种设置意味着,一般来说,您在xib中不是顶级对象的出口应该是弱的(在ARC下)或分配(如果是MRR下的属性).他们不拥有关系;它们基本上是方便的索引到视图列表中.这是Apple’s recommendation:
…you don’t need strong references to objects lower down in the graph because they’re owned by their parents,and you should minimize the risk of creating strong reference cycles.
[…]Outlets should generally be
weak
,except for those from File’s Owner to top-level objects in a nib file (or,in iOS,a storyboard scene) which should bestrong
. Outlets that you create should will [sic] therefore typically beweak
by default…
正如我所解释的那样,你的简单指针IBOutlets – 出于内存管理的目的 – 就像弱属性一样**,这意味着它们正在做正确的事情.在ARC下编译时,相同的声明可能是错误的.
总结:IBOutlet不会转化为弱,但它确实改变了指针的含义.自IBOutlet UIButton *按钮的默认内存管理语义;从ARCR下的“assign”变为ARC下的“拥有”,并且由于IBOutlets通常应该是非拥有的,因此IBOutlet的存在确实意味着指针应该在ARC下声明为__weak.†
*类似于弱属性 – 唯一的区别是当对象被释放时,弱指针被设置为nil.
**除了auto-nil部分.
†或者,实际上,它应该是一个弱势属性.