IBOutlet是否暗示__weak?

问题描述:

刚刚开始与ARC。在ARC之前,我只是简单地声明我的店铺,例如:IBOutlet UIButton *button;,所以我不保留它或任何东西。使用ARC,不指定弱或强意味着强。IBOutlet是否暗示__weak?

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

总之,确实IBOutlet中暗示__weak?

IBOutlet实际上是定义为虚无

#define IBOutlet 

Xcode的只是使用这个词的存在您的代码用于允许您在Interface Builder中进行连接。一个变量声明或属性作为IBOutlet

IBOutlet UIButton * button; 
@property (...) IBOutlet UIButton * button; 

因此不具有任何直接影响,只要ARC而言;它不(虽然,可以想象,它可以)翻译成__weak或类似的东西。在编译器获取它时,这个词本身完全从你的源代码中消失。

在另一方面,事实证明这个变量或属性是出口确实对如何需要考虑内存管理的一个有意义的作用。

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

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

...你不需要对象下强引用倒在图中,因为它们是由他们的父母所拥有的,你应该最大限度地避免形成很强的参考周期的风险。

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

你简单的指针IBOutlet S,正如我所解释的,担任 - 内存管理的目的 - 像weak性质,其中**意味着他们正在做正确的事情。在ARC下编译时,相同的声明变成可能是错误的东西

总结:IBOutlet转化为weak,但它确实改变指针的含义。由于IBOutlet UIButton * button;的默认内存管理语义从MRR下的“分配”变为ARC下的“所有”,并且因为IBOutlet一般应该是非拥有的,所以存在IBOutlet确实意味着该指针应该被声明为__weak弧。


*而类似weak属性 - 唯一的区别还有就是weak指针设置为nil当对象被释放。

**除自动-nil部分。或者,应该是weak属性。

+0

谢谢,现在更清楚了。但是有一件事我很困惑:即使我没有明确地将IBOutlet定义为__weak(在这种情况下它会很强大),ARC是不是会照顾它呢?只要没有保留周期(并且没有保留周期),一切都照顾好了,不是吗? – 0xSina 2012-05-04 12:42:12

+0

ARC会继续做它的工作,所以,只要你避免保留周期,一个强大的IBOutlet也可以工作。 – 2012-05-04 17:31:10

的IBOutlet中关键字仅用于该对象与在界面生成器的元件相关联。它与弱或强或ARC或内存管理无关。

+0

这很荒唐; “IBOutlets”的内存管理需要像任何其他变量的管理一样考虑。 – 2012-04-25 03:17:15

+2

@JacquesCousteau不是真的,仔细阅读他的答案,IBOutlet KEYWORD与天气无关,财产将被设置为强或弱。他所说的是100%准确的。无论您如何决定管理该对象内存。 – Pochi 2012-04-25 03:23:26

+0

IBOutlet的财产需要像管理任何其他财产一样进行管理,但IBOutlet不会考虑它。 – bbarnhart 2012-04-25 03:25:46

不,IBOutlet基本上是在代码编译时被剥离的。但它是XCode的助手,因此它可以知道什么是InterfaceBuilderOutlet。

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

默认情况下它仍然很强(假设这个词不存在)。

但是,建议您将其设置为弱,因为一旦某个东西连接到接口构建器,那么THAT接口将保持对它的强引用,所以没有必要具有双重强引用,特别是如果该元素并不意味着在界面卸载时保持活动状态。

阅读本题,这正是你正在寻找:

Should IBOutlets be strong or weak under ARC?

+1

我是否必须将我的IBOutlet声明为属性? – 0xSina 2012-04-25 03:21:57

+0

不,你可以直接声明它们作为实例变量,如果你在MacOS上执行它们,它们会有所不同,你可以在这里阅读更多关于它的信息:http://stackoverflow.com/questions/1221516/does-an-iboutlet - 需要一个财产合成 – Pochi 2012-04-25 03:27:11

+1

好吧,如果我确实声明他们为实例变量,最好是这样的:__weak IBOutlet UIButton *按钮,对不对? – 0xSina 2012-04-25 03:30:38