IBOutlet是否意味着__weak?

时间:2012-04-25 03:03:50

标签: objective-c ios cocoa-touch automatic-ref-counting

刚开始使用ARC。在ARC之前,我只是简单地宣布我的网点为例:IBOutlet UIButton *button;所以我不保留它或任何东西。使用ARC,不指定弱或强意味着强大。

所以如果我在ARC下做同样的事情(即IBOutlet UIButton *button;),这是否意味着按钮是一个强大的参考?或者我是否必须将其定义为弱势?

简而言之,IBOutlet是否意味着__weak?

3 个答案:

答案 0 :(得分:16)

单词IBOutlet实际上定义为无:

#define IBOutlet

Xcode只是在代码中使用了这个单词,以便您在Interface Builder中建立连接。将变量或属性声明为IBOutlet

IBOutlet UIButton * button;
@property (...) IBOutlet UIButton * button;
因此,就ARC而言,没有任何直接影响;它(虽然,可以想象,它可以)转化为__weak或类似的东西。在编译器得到它的时候,这个词本身就完全从你的源头消失了。

另一方面,此变量或属性是插座的事实需要考虑内存管理的方式产生了有意义的影响。

ARC下的IBOutlet UIButton * button;之类的对象变量声明的隐式存储限定符是__strong,正如您所说的 - 分配给该变量的任何对象都将被视为“拥有”。在MRR下,声明只是一个指针;分配对指定对象的引用计数/所有权没有影响 - 它的行为方式与assign属性相同。*因此,相同的ivar声明的含义在两个管理系统之间发生变化。

xib中的对象拥有由视图层次结构形成的所有者/所有者关系;也就是说,父视图拥有自己的子视图。 xib中的顶级视图由称为文件所有者的对象拥有。此设置意味着,一般来说,您在顶级的xib中的对象的出口应该是weak(在ARC下)或assign(如果属于MRR)。他们不拥有关系;它们基本上是方便的索引到视图列表中。这是Apple's recommendation

  

...您不需要对图表中较低的对象进行强引用,因为它们由父母拥有,您应该尽量减少创建强引用周期的风险。

     

[...]奥特莱斯通常应该是weak,除了那些从文件所有者到nib文件中的顶级对象(或者,在iOS中,故事板场景)应该是strong }。因此,您创建的出口[sic]通常默认为weak ...

正如我所解释的那样,你的简单指针IBOutlet用于内存管理 - 如weak属性,**这意味着它们正在做正确的事情。在ARC下编译时,相同的声明变成可能是错误的

总结:IBOutlet不会翻译成weak,但它确实会改变指针的含义。由于IBOutlet UIButton * button;的默认内存管理语义从MRR下的“assign”变为ARC下的“拥有”,并且由于IBOutlet s通常应该是非拥有的,IBOutlet的存在确实存在确实暗示指针应该在ARC下声明为__weak


*与weak属性类似 - 唯一的区别是当释放对象时weak指针设置为nil

**除了自动nil部分。

或者,它确实应该是weak属性。

答案 1 :(得分:4)

不,编译代码时基本上剥离了IBOutlet。然而它是XCode的帮助器,因此它可以知道什么是InterfaceBuilderOutlet。

基本上这个词可以让你在Interface Builder中连接元素。

默认情况下它仍然很强(想象一下这个词不存在)。

然而,建议您将其设置为弱,因为一旦某些东西连接到接口构建器,THAT接口将保持对它的强引用,因此没有必要使用双强引用,特别是如果该元素是卸载界面时不打算保持活着状态。

阅读这个问题,这正是您所寻找的:

Should IBOutlets be strong or weak under ARC?

答案 2 :(得分:3)

IBOutlet关键字仅用于将对象与Interface Builder中的元素相关联。它与弱或强或ARC或内存管理无关。

相关问题