作为一名新的iOS程序员,我今天遇到了大量的错误,其中一些与我使用弱属性而不是强大有关。
我意识到一个优秀的程序员不会遇到这个问题,并且只会将属性设置为强大的需要,但是,在我的新手眼中,我看不出为什么我应该使用弱,它只会添加有问题的风险。
答案 0 :(得分:7)
一般情况下,您应该通过查看持有该属性的类与该属性的值之间的关系来决定weak
,strong
,assign
和copy
之间的关系。财产,以及通过的财产的种类。
assign
(或根本不使用所有权限定符)strong
NSCopying
协议的标量,可变对象,请使用copy
strong
NSCopying
协议的可变对象,但所有权仍由调用方保留,请使用copy
weak
。所有权的概念在引用计数的内存模型中非常重要。这是您决定的主要驱动因素。您需要确定对象的主要所有者,并为该所有者提供强大的引用。如果所有权在一组对象之间共享,请给予他们强有力的参考。
最困难的情况是物体可以直接或间接地相互拥有。在这种情况下,您最好将“所有权”替换为“了解”,为所有对象提供“拥有”每个人的共同“顶级”所有者,并使用weak
引用来模拟“了解”关系。< / p>
答案 1 :(得分:1)
weak
和strong
对于实现内存管理非常重要。
strong
将增加指针的引用计数器,并且您有效地说您拥有该对象。
weak
不会增加引用计数器,并且该对象可能随时消失。如果你有一个循环依赖,你应该使用weak
来避免内存泄漏(两个对象之间具有强引用的对象是循环依赖,并且这些对象永远不会被释放)。
你应该总是考虑你的记忆管理,但一个好的经验法则是该属性应该始终是strong
,除非你肯定知道它被保留在其他地方。只要没有循环引用,多个对象就可以对同一个对象进行strong
引用,没有任何问题。
答案 2 :(得分:1)
一些超级基本的经验法则:
如果您希望对象至少附近,直到您完成它,请使用强大
如果你可以处理对象消失而不会伤害你太糟糕(也就是创建你的父母可能很好知道但不是非常重要)然后使用弱强>
如果它不是 NSObject (因此是int,bool float或其他原始类型),请使用 assign 。
答案 3 :(得分:-3)
我使用的经验法则是:如果对象保留在其他地方,请使用弱。对我来说最重要的是使用界面构建器。如果您有IBOutlet
,则可以使其变弱,因为该对象在接口构建器和XIB文件中处理