为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Objective-C代理通常给予属性赋值而不是保留?

为什么Objective-C代理通常给予属性赋值而不是保留?

holdtom 2019-07-29 15:02:01
为什么Objective-C代理通常给予属性赋值而不是保留?我正在浏览Scott Stevenson维护的精彩博客,我正在尝试理解一个基本的Objective-C概念,即为委托者分配'assign'属性vs'retain'。注意,两者在垃圾收集环境中是相同的。我主要关注的是非基于GC的环境(例如:iPhone)。直接来自Scott的博客:“assign关键字将生成一个setter,它直接将值赋给实例变量,而不是复制或保留它。这最适用于NSInteger和CGFloat等原始类型,或者你不直接拥有的对象,如委托。”你不直接拥有委托对象是什么意思?我通常会保留我的代表,因为如果我不希望他们离开深渊,保留将为我照顾。我通常抽象UITableViewController远离其各自的dataSource和委托。我也保留那个特定的对象。我想确保它永远不会消失,所以我的UITableView总是有它的代表。有人可以进一步解释我错在哪里/为什么,所以我可以理解Objective-C 2.0编程中使用委托上的assign属性而不是retain的常见范例吗?谢谢!
查看完整描述

3 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

因为发送委托消息的对象不拥有委托。

很多时候,它是相反的,因为当控制器将自己设置为视图或窗口的委托时:控制器拥有视图/窗口,因此如果视图/窗口拥有其委托,则两个对象将彼此拥有。当然,这是一个保留周期,类似于具有相同结果的泄漏(应该死的物体保持活着)。

其他时候,对象是对等的:没有一个拥有另一个,可能是因为它们都由同一个第三个对象拥有。

无论哪种方式,具有委托的对象都不应保留其委托。

(顺便说一下,至少有一个例外。我不记得它是什么,我认为没有充分的理由。)


附录(2012-05-19补充):在ARC下,你应该使用weak而不是assignnil当对象死亡时,弱引用会自动设置,从而消除了委托对象最终向死代表发送消息的可能性。

如果由于某种原因您远离ARC,至少更改assign指向对象的属性unsafe_unretained,这明确表明这是对对象的未归属但非归零的引用。

assign 仍适用于ARC和MRC下的非对象值。


查看完整回答
反对 回复 2019-07-29
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

请注意,当您拥有一个赋值的委托时,每当要释放该对象时,始终将该委托值设置为nil非常重要 - 因此,如果某个对象没有取消分配,则应始终小心地将该委托引用置为无效在其他地方这样做


查看完整回答
反对 回复 2019-07-29
  • 3 回答
  • 0 关注
  • 402 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信