ARC 原理

1.内存管理的思考原则

(1)自己生成的对象自己持有

(2)非自己生成的对象自己也能持有

(3)不再需要自己持有的对象时释放

(4)非自己持有的对象无法释放

2.Objective-C 方法 alloc/new/copy/mutableCopy  生成并持有对象

                                   retain方法                                  持有对象

                                   release方法                                释放对象

                                 dealloc方法                                   废弃对象

其中copy方法是基于NSCopying方法约定,由各类实现的copyWithZone方法:方法生成并持有对象的副本,与copy方法类似,mutableCopy方法是基于NSMutableCopying方法约定,由各类实现的mutableCopyWithZone:方法生成并持有对象的副本。两者的区别在于copy生成不可变更的对象,mutableCopy生成可变更的对象

3.autorelease方法功能:是对象在超出指定的生存范围时能够自动并正确的释放(释放时调用release方法)

autolease方法和release方法不同之处在于,release方法立即释放对象,autorelease方法把对象注册到autoreleasepool中,pool结束时自动调用release方法。

4.alloc/retain/release/dealloc 在GNUstep中的实现总结

(1)在Objective-C的对象中存有引用计数这一整数值(苹果实现此处不同)

(2)调用alloc或retain方法后,引用计数值加1

(3)调用release方法后,引用计数减1

(4)引用计数值为0时,调用dealloc方法废弃对象

5.苹果内存管理和引用计数的实现

(1)malloc 和 calloc区别

malloc只负责分配空间,对空间内的内容不做处理,需要memset函数对内存进行赋值

calloc函数分配空间后相应内存空间置0,

(2)GNUstep将引用计数对象保存在占用内存头部的变量中,而苹果的实现则是保存在应用计数表中

通过内存块头部管理引用计数好处如下:

少量代码即可完成

能够统一管理引用计数用内存块与对象用内存块

通过引用计数表管理应用计数好处如下:

对象用内存块分配无需考虑内存块头部

应用计数表各记录中存有内存块地址,可以从各个记录追溯到各对象的内存块

6.ARC所有权修饰符一共有四种(GNUstep实现)

__strong 修饰符

__weak 修饰符

__unsafe_unretained 修饰符

__autoreleasing 修饰符

__strong __weak 和 __autoreleasing 修饰符可以保证附有这些修饰符的自动变量初始化为nil

(1)__strong  修饰符

__strong 修饰符生成并持有对象,retainCount +1,id类型和对象类型的修饰符默认为__strong类型

(2)__weak 修饰符

主要用于解决循环引用问题

__weak 修饰符生成不持有对象,所以能够解决循环引用问题(循环引用容易发生内存泄漏。所谓内存泄漏就是应当废弃的对象超过其生命周期后继续存在)

循环引用:包括类成员变量的循环引用,自引用(对自身的强引用)

__weak修饰符在持有某一个对象的弱引用时。若该对象被废弃,则此弱引用自动失效且处于nil被赋值状态(空弱引用)。通过检查附有__weak修饰符的变量是否为nil,可以判断被赋值的对象是否被已被废弃

访问__weak修饰符的变量时,实际上必定要访问注册到autoreleasepool的对象。

原因:__weak修饰符之持有对象的弱引用,在访问弱引用的过程中,该对象有可能被废弃。如果把要访问的对象注册到autoreleasepool中,那么在@autoreleasepool块结束之前都能确保该对象的存在。因此,在使用附有__weak修饰符的变量时就必定要使用到autoreleasepool中的对象。

(3)__unsafe_unretained 修饰符

不安全的所有权修饰符。ARC式内存管理是编译器的工作,但是附有__unsafe_unretained 修饰符的变量不属于编译器的内存管理对象

__unsafe_unretained  修饰符和__weak修饰符的相同点

如id __unsafe_unretained obj = [[NSObject alloc] init];

上述代码将自己生成并持有的对象赋值给__unsafe_unretained修饰符修饰的变量中,所以obj不持有该对象,所以同__weak修饰符一样生成的对象会立即被释放(或者说随时有可能被释放)

异同点:

__unsafe_unretained 修饰符修饰的变量,超出其作用域释放后并不会置为nil,所以废弃后调用会导致程序崩溃(出现悬垂指针)

(4)__autoreleasing 修饰符

__autoreleasing 修饰符在ARC有效时并不显示调用,

使用@autoreleasepool{ 

}

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

推荐阅读更多精彩内容