IBOutlet是否意味着__weak?

0xS*_*ina 6 cocoa-touch objective-c ios automatic-ref-counting

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

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

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

Jos*_*ell 16

这个词IBOutlet实际上被定义为什么:

#define IBOutlet
Run Code Online (Sandbox Code Playgroud)

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

IBOutlet UIButton * button;
@property (...) IBOutlet UIButton * button;
Run Code Online (Sandbox Code Playgroud)

因此,就ARC而言,没有任何直接影响; 它(虽然,可以想象,它可以)转化为__weak或类似的东西.在编译器得到它之前,这个词本身就完全从你的源代码中消失了.

另一方面,这个变量或属性是一个插座的事实确实会对需要如何考虑内存管理产生有意义的影响.

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

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

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

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

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

总结:IBOutlet翻译weak,但它确实改变指针的含义.由于默认的内存管理语义IBOutlet UIButton * button;从"分配" MRR下更改为"拥有" ARC下,由于IBOutletS的关系通常是不拥有它的存在IBOutlet确实意味着指针应被宣布__weakARC下.


*和weak属性类似- 唯一的区别是weak指针被设置nil为取消分配对象时.

**除了自动nil部件.

或者,实际上,它应该是一个weak财产.