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理无关。