在ARC下使用IBOutlets属性的有用性?

问题描述:

在ARC下,让每个IBOutlet成为一个属性有什么意义?对于仅在视图控制器内部使用的IBOutlets使用ivars有什么缺点?在ARC下使用IBOutlets属性的有用性?

+0

你为什么认为必须创建属性? – Phlibbo

+0

@Phlibbo:我一直在这里和那里看到,这是“良好的做法”,并简化了viewDidUnload代码。 –

+0

我希望有一本类似于Scott Meyers和Herb Sutter为C++编写的书的“有效的iOS”书。 –

如果您不使用setter/getter方法进行任何操作,请不要依赖这些属性的键值观察,也不要预期子类会从覆盖这些属性中受益,那么就没有真正的在ARC下使用IBOutlets的ivars的缺点。

+0

谢谢,ivars会在我的代码中消除很多'self.'前缀。 –

+0

请查看我的答案,并让我知道你是否对任何事情有所了解。 –

我一直在为我的“私人”IBOutlets使用ivars,并遇到内存泄漏问题。我认为这是因为我的IBOutlets使用__unsafe_unretained属性而不是__weak。我不能使用__weak,因为它不支持iOS 4(我希望我的应用程序与iOS 4向后兼容)。很难掌握ARC,IBOutlets,viewDidUnload以及所有这些混乱情况的真实情况。唉...

总之,当我将IBOutlets从ivars更改为属性时,内存泄漏问题就消失了。

因此,要回答我自己的问题,使用IBOutlets的ivars的一个缺点是,如果您拥有__unsafe_unretained属性,则可能会遇到内存泄漏。

+0

这不可能是你的泄漏源头。如果你的网点是'__unsafe_unretained',那么根据定义,这些ivars没有保留它们的目标,*不保留*某件东西永远不会导致泄漏。 (它可能导致崩溃,但这是另一回事。)你没有指定你添加的属性是否同样是'unsafe_unretained',但无论哪种方式,通过添加属性你可以做的唯一的事情就是*更多*保留。没有更多的细节,不可能说出你为什么泄漏。如果你真的好奇,你可以提交另一个问题。 –

+0

我添加的属性确实是'unsafe_unretained'。我真的很困惑,为什么将IBOutlets从ivars更改为属性会产生变化。也许我没有正确解释XCode的仪器。 –

+0

unsafe_unretained可能会导致崩溃,但不会导致泄漏。我会说你正在解释器械错误。抱歉。 :)但那就是说,现在已经有好几个月了:你对所发生的事情有更多的了解吗? –