当前位置:  开发笔记 > IOS > 正文

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

如何解决《为什么Objective-C代理通常给予属性赋值而不是保留?》经验,为你挑选了3个好方法。

我正在浏览Scott Stevenson维护的精彩博客,我正在尝试理解一个基本的Objective-C概念,即为委托者分配'assign'属性vs'retain'.注意,两者在垃圾收集环境中是相同的.我主要关注的是非基于GC的环境(例如:iPhone).

直接来自Scott的博客:

"assign关键字将生成一个setter,它直接将值赋给实例变量,而不是复制或保留它.这最适用于NSInteger和CGFloat等原始类型,或者你不直接拥有的对象,如委托."

你不直接拥有委​​托对象是什么意思?我通常会保留我的代表,因为如果我不希望他们离开深渊,保留将为我照顾.我通常抽象UITableViewController远离其各自的dataSource和委托.我也保留那个特定的对象.我想确保它永远不会消失,所以我的UITableView总是有它的代表.

有人可以进一步解释我错在哪里/为什么,所以我可以理解Objective-C 2.0编程中使用委托上的assign属性而不是retain的常见范例吗?

谢谢!



1> Andrew Pouli..:

您避免保留委托的原因是您需要避免保留周期:

A创建B A将自己设置为B的委托...... A由其所有者发布

如果B保留A,则A不会被释放,因为B拥有A,因此A的dealloc永远不会被调用,导致A和B泄漏.

你不应该担心A会消失,因为它拥有B并因此在dealloc中摆脱它.


@wcochran:不,这个问题是为什么使用`assign`而不是`retain`.这个问题比ARC早; 在引入ARC之前,`weak`和`strong`(后者与`retain`同义)并不存在.您应该分别询问关于"弱"与"分配"的问题.
您的代码永远不应该以nil委托导致它崩溃的方式编写.只有拥有对象应该拥有自己的参考.dealloc'd时,它必须在释放它们之前将拥有对象的委托设置为nil.然后,忽略发送给nil委托的任何消息.但是,在消息中传递nil对象*可能会崩溃.只是确保你没有那样处理代表.

2> Peter Hosey..:

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

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

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

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

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


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

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

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


`NSURLConnection`保留其委托.

3> Kendall Helm..:

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


因为任何引用左设置,在取消分配对象(指向内存不再分配给预期的对象类型)后将无效 - 因此如果您尝试使用它会导致崩溃.调试器中的这一点的标志是当调试器声称某个变量具有从变量实际声明为什么似乎完全错误的类型时.
推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有