为什么呢?今天突然遇到这个问题,有点说不清楚,虽然自己一直都这么用,但是!怎么能知其然而不知其所以然呢?

看了一个博主回答的挺好:

{

一个对象没必要管理自己delegate的生命周期,或者说没必要拥有该对象,所以我们只要知道它的指针就可以了,用指针找到对象去调用方法,也就是委托实现的感觉。
或者我们换个角度,从内存管理方面也可以解释这个问题。delegate的生命周期不需要让该对象去控制,如果该对象对其使用retain很可能导致delegate所指向的对象无法正确的释放。
}

最后在说一下循环引用:
{

所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系:
对象a创建并引用了对象b.对象b创建并引用了对象c.对象c创建并引用了对象b.
这时候b和c的引用计数分别是2和1。当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。
这种情况,必须打断循环引用,通过其他规则来维护引用关系。比如,我们常见的delegate往往是assign方式的属性而不是retain方式的属性,赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。如果一个UITableViewController 对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a, 如果这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。自己在设计使用delegate模式时,也要注意这点。
因为循环引用而产生的内存泄露也是Instrument无法发现的,所以要特别小心。

}

为什么delegate属性使用assigne而不是retain?相关推荐

  1. [react] 为什么属性使用className而不是class呢?

    [react] 为什么属性使用className而不是class呢? class是关键字 js会使用dom.className获取样式名,跟js保持一致 个人简介 我是歌谣,欢迎和大家一起交流前后端知 ...

  2. Objective-c属性修饰关键字(assign retain copy strong weak)

    一.线程相关: [atomic/nonatomic] (1)atomic[默认属性]:OC使用的一种线程保护技术,是防止在写未完成的时候被另外一个线程读取,造成数据错误.而这种机制是耗费系统资源的,所 ...

  3. Objective-C之MRC、ARC模式下,属性修饰关键字strong、retain、assign、weak的区别和联系...

    平时用strong.retain.assign.weak这几个关键字的时候,也没有过多的在意,下边就MRC.ARC模式下,每个关键字做一下总结.为了简明期间,采用表格的形式进行展示. MRC ARC ...

  4. iOS: 属性声明strong和retain竟然不一样

    今天和同事在处理一处用strong声明的Block属性引发的问题时偶然发现的.在诸多教程中都会讲到:声明属性时用strong或者retain效果是一样的(貌似更多开发者更倾向于用strong).不过在 ...

  5. iOS 中KVC、KVO、NSNotification、delegate 总结及区别

    iOS 中KVC.KVO.NSNotification.delegate 总结及区别 1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属 ...

  6. @synthesize@dynamic@private,@protected,@publicassign、weak、strong、retain、copy、nonatomic、atomic

    iOS属性修饰关键字 1. @private,@protected,@public,@package详解及使用 @privite:私有的,只有本类(不包括子类)自己拥有 @protected:受保护的 ...

  7. 四大传值详解:属性传值,单例传值,代理传值,block传值

    一:属性传值 传值情景:从前一个页面向后一个页面传值 a.在后一个页面,根据传值类型和个数,写属性 b.在前一个页面, 为属性赋值 c.在后一个页面, 使用值 例如: 第一个视图: #import & ...

  8. Objective-C 2.0属性(Property)介绍

    通常在声明一些成员变量时会看到如下声明方式: @property (参数1,参数2) 类型 名字: 这里我们主要分析在括号中放入的参数,主要有以下三种: setter/getter方法(assign/ ...

  9. 再谈 retain,copy,mutableCopy(官方SDK,声明NSString都用copy非retain)

    之前一直以为retain就是简单的计数器+1,copy就是重新开辟内存复制对象: 其实不是这样,原来之前的自己独自徘徊于糊涂之中. (官方SDK,对NSString属性的定义都是用copy,而不是re ...

最新文章

  1. matlab画多个垂直的线段,新手求助,图形最后多出一条垂直线
  2. 【本人秃顶程序员】synchronized锁住的是代码还是对象
  3. 设置centos7语言显示环境
  4. aspx、ashx、asmx文件处理请求效率比较
  5. [转]Android 常见安全漏洞修复理论与实践
  6. LeetCode 205. 同构字符串(哈希map)
  7. Linux 添加alisa,Linux/shell命令的实际应用——alias增加自定义命令
  8. 国内少有的Flutter干货分享:Flutter的原理及美团的实践!
  9. 贝叶斯集锦:从MC、MC到MCMC
  10. 计算机加入域无法访问登录,不加入域不能访问域资源
  11. U盘灯狂闪,读不到盘
  12. 医学图像处理与深度学习入门
  13. BI神器Power Query(4)-- PQ导入动态名称定义的表格
  14. 面向对象_匿名内部类的格式和理解
  15. springboot实现反向代理
  16. Activiti - 新一代的开源 BPM 引擎
  17. cocos获取图片像素
  18. POI XWPFDocument 导出word目录详解
  19. 如何使用PyDenseCRF
  20. Unity3D动态修改RectTransform

热门文章

  1. 【转】一个小公司老板的日常管理,希望能让创业的朋友学到东西
  2. ch352l串口卡驱动
  3. zzuli OJ 1114: 逆序
  4. Python将日期月份转为英文和英文转为数字月份
  5. 计蒜客 联想专卖店大促销 二分
  6. 19年深圳杯D题之爬取微博粉丝基本信息
  7. 洛谷or牛客数据结构+算法
  8. 蒙哥马利模乘算法python实现
  9. 【手把手教你】股票可视化分析之Pyecharts(二)
  10. 路人甲的 Python 总结