12.iOS中的ARC内存管理机制

12.iOS中的ARC内存管理机制

1. @property 声明属性

1.1 本质

使用@property声明属性,编译器可以自动合成实例变量(_属性名)、getter方法和setter方法

1.2 在 @protocol 和 category 中使用 @property

  1. 在protocol中使用property只会生成setter方法和getter方法声明,使用属性的目的是希望遵守协议的对象能实现该属性。

  2. category使用@property,编译器不会自动合成setter方法和getter方法,类别中无法把实现属性所需的实例变量及其存取方法合成出来,而需要在实现文件中使用@dynamic + 属性名; 的方法告诉编译器在运行时添加setter方法和getter方法,或者是直接在类的实现文件中直接添加该属性的setter方法和getter方法。

1.3 修饰符

1.3.1 原子性

  • atomic(默认属性):线程保护技术,防止在未写完成的时候被另外一个线程读取,造成数据错误,这种机制耗费系统资源的。

  • noatomic:访问器只是简单返回这个值,访问速度快。

1.3.3 读写权限

  • readwrite(读写):同时生成读写方法

  • readonly(只读):只生成getter方法

1.3.4 内存管理

这些内存管理的属性只影响设置方法——setter方法

  • assign:设置方法只会针对基本的数据类型进行简单的赋值操作

  • strong:strong类型的属性定义了一种“拥有的关系”,当这种属性设置新值时,会先保留新值,再释放旧值,然后将新值设置给该属性

  • weak:定义了属性间的非拥有的关系,与强引用不同的是weak弱引用既不保留新值,也不释放旧值,与assign类似,当该属性指向的对象被销毁时,属性值被自动设为nil。

runtime 如何实现 weak 变量的自动置nil?

runtime对注册的类,会进行布局,对于weak属性的对象会存入一个hash表中,用weak指向的对象的内存地址作为key,当此对象的引用计数为0的时候会调用dealloc方法,,此时hash表中找到以key为键所对应的那个对象设置为nil。

  • unsafe_unretained:与weak属性类似,不同的是unsafe_unretained属性在进行是方法的时候,并不会将该属性置为nil,而是直接释放,这样就会出现野指针,再向这个属性发送消息时会造成程序因异常而结束。

  • copy:与strong属性类似,但是weak属性并不保留新值,而是拷贝新值的一个副本,并赋给该属性,这样保护了程序的封装性。

  • 方法名:可以在定义属性的时候设置该属性的存取方法名。

2. ARC的本质

ARC是编译时的特性,而不是运行时特性,也不是垃圾回收机制。ARC是自动引用计数,是对MRC的改进。

2.1 ARC下的变量修饰符:

  • __strong:(默认)对应property中的strong修饰符,所有对象只有当没有任何一个强引用指向是,才会被释放。如果需要释放强引用指向的对象时,需要将强引用置为nil。
  • __weak:对应property中的weak修饰符,弱引用不会持有对象,只要对象没有强引用指向,就会在该程序段结束后释放,同时将该变量指向的内存置为空。
  • __autoreleasing:会将使用__autoreleasing修饰的属性放入自动释放池。
  • __unsafe_unretained:与weak的作用类似,没有任何额外的操作,但是在指向对象被释放时依然原原本本地指向原来被释放的对象(所在的内存区域)。所以非常不安全。

2.2 ARC与block

  1. 在MRC中,block会对进入其作用域内的对象(或被block捕获的指针指向的对象)隐式的添加retain,来保证block可以正确使用该对象。但此时容易出现循环引用的问题,即block引用了该类的实例变量,而该类的实例变量用持有该block,这就需要在block使用该对象之前,用__block修饰符修饰该对象。

    在MRC中使用__block的作用:

    • 说明变量可改。(静态变量和全局变量,实例变量在block中是可以被改变的)
    • 说明指针指向的对象不能做隐式的retain操作。
  2. 在ARC中,没有了retain和release操作,此时使用__ block只影响了变量的可修改属性,被block捕获的强引用还是强引用,依旧会造成循环引用的状况。此时需要使用__weak生成一个弱引用,指向需要在block中使用的强引用:

    ViewController * __weak weakSelf = self;
    //或者
    __weak typeof(self) weakSelf = self;
    
4. ARC与Toll-Free Bridging

Toll-Free Bridging是使用户可以方便的使用同一种语法来使用CoreFoundation对象和Objective-C对象。

  1. MRC时,OC对象和CF对象多使用相同的release和retain操作

  2. ARC时,OC对象的内存管理规则改变,而CF对象依然是之前的机制(不支持ARC机制)

  3. 引入ARC后对Toll-Free Bridging的操作加入对应的方法与修饰符,用来指明用哪种规则管理内存,或者说是内存管理权的归属。

    • __bridge(修饰符):只是声明类型转变,但是不做内存管理规则的转变。
    • __bridge_retained(修饰符) 或 CFBridgingRetain(函数):表示将指针类型转变的同时,将内存管理的责任由原来的Objective-C交给Core Foundation来处理,也就是,将ARC转变为MRC。
    • __bridge_transfer(修饰符) 或 CFBridgingRelease(函数):功能和上面的__bridge_retained相反,它表示将管理的责任由Core Foundation转交给Objective-C,即将管理方式由MRC转变为ARC。
3. MRC手动释放引用计数

一个new/alloc/retain/copy/muticopy对应一个release和一个autorelease。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,339评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,092评论 1 32
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,259评论 0 11
  • 写作从自己出发,再回到自己,只有如此才能走近别人的心里。 若论身世,我们同样土鸡蛋一枚,可是她先于我破壳而出了,而...
    于小芙阅读 101评论 1 2
  • 时好时坏
    自然清醒爱自己阅读 151评论 0 0