IBOutlet是否暗示__weak?
刚刚开始与ARC。 在ARC之前,我只是简单地声明我的sockets,例如: IBOutlet UIButton *button;
所以我不保留它或任何东西。 用ARC,不指定弱或强意味着强。
所以,如果我在ARC(即IBOutlet UIButton *button;
)下做同样的事情,这是否意味着button是一个强有力的参考? 或者我必须将其明确定义为弱?
总之,IBOutlet意味着__weak?
IBOutlet
这个词实际上被定义IBOutlet
都没有:
#define IBOutlet
Xcode只是在你的代码中使用这个词的存在,目的是让你在Interface Builder中build立连接。 将variables或属性声明为IBOutlet
:
IBOutlet UIButton * button; @property (...) IBOutlet UIButton * button;
因此就ARC而言并没有直接的影响; 它不(虽然,可以想象,它可以)翻译成__weak
或类似的东西。 编译器得到它的时候,这个词本身就完全没有了。
另一方面,这个variables或属性是一个出口的事实对于你如何考虑内存pipe理有一个有意义的影响。
对象variables声明的隐式存储限定符,如IBOutlet UIButton * button;
在ARC下是__strong
,正如你所说的那样 – 分配给variables的任何对象将被视为“拥有”。 根据MRR,声明只是一个指针; 赋值对赋值对象的引用计数/所有权没有影响 – 它的作用与assign
属性相同*因此,两个pipe理系统之间相同的伊娃声明的含义不同。
xib中的对象拥有由视图层次结构形成的所有者/所有者关系; 也就是说,父视图拥有他们的子视图。 xib中的顶层视图由称为文件所有者的对象拥有。 这种设置意味着,一般来说,对于不在顶层的xib中的对象的出口应该是weak
(在ARC下)或者assign
(如果是MRR下的属性)。 他们不是拥有关系; 它们本质上是查看列表中方便的索引。 这是苹果的build议 :
…您不需要强烈地引用图表中较低的对象,因为它们是由父母拥有的,您应该尽量减less创build强引用周期的风险。
[…] Outlets通常应该是
weak
,除了文件所有者对于笔尖文件中的顶级对象(或者在iOS中,故事板场景)应该是strong
。 因此,您创build的出口商应该[原文如此]默认情况下通常很weak
。
你的简单指针IBOutlet
,就像我说的那样,为了内存pipe理的目的而行事,比如weak
属性,这意味着他们正在做正确的事情。 在ARC下编译时,相同的声明可能是错误的 。
总之: IBOutlet
不会转化成weak
,但它确实改变了指针的含义。 由于IBOutlet UIButton * button;
的默认内存pipe理语义IBOutlet UIButton * button;
从MRR下的“assign”改为ARC下的“owned”,并且由于IBOutlet
通常应该是非拥有的,因此IBOutlet
的存在确实意味着指针应该在ARC下被声明为__weak
。 †
*类似于一个weak
属性 – 唯一的区别是当对象被释放时weak
指针被设置nil
。
**除自动部分外。
†或者,实际上,这应该是一个weak
财产。
不,在编译代码时,IBOutlet基本上被剥离了。 但它是XCode的一个帮助器,因此它可以知道什么是InterfaceBuilderOutlet。
基本上这个词可以让你连接Interface Builder中的元素。
默认情况下,它仍然是强大的(只要想象这个词不存在)。
然而,build议您将其设置为弱,因为一旦某个东西连接到了接口构build器,那么THAT接口就会强烈引用它,所以没有必要具有双重强引用,特别是如果该元素不是为了在界面卸载时保持活动状态。
阅读这个问题,这正是你在找什么:
在IB之下IBOutlets应该强大还是弱?
IBOutlet关键字仅用于将对象与Interface Builder中的元素相关联。 它与弱或强或ARC或内存pipe理无关。