内存管理与引用计数

引用计数式内存管理的思考方式

引用计数式的内存管理方式主要涉及四个操作:生成对象,持有对象,释放对象,废弃对象。

  • 内存管理的思考方式

    • 自己生成的对象,自己持有
    • 非自己生成的对象,自己也能持有
    • 不再需要自己持有的对象时释放
    • 非自己持有的对象无法释放

与oc中方法对应如下:

+对象操作                       +Oc方法
生成并持有对象             alloc/new/copy/mutablecopy等方法
持有对象                        retain方法
释放对象                        release方法
废弃对象                        dealloc方法
  • 自己生成的对象,自己持有

使用alloc, new, copy, mutablecopy开头的方法意味着自己生成的对象自己持有

注:命名要符合驼峰命名法。

  • 非自己生成的对象,自己也能持有

通过retain方法,非自己生成的对象也可以持有对象了。

  • 不再需要自己持有的对象时释放

自己持有的对象,一旦不再需要,持有者有义务释放该对象。释放使用release方法。

使用autorelease方法可以使取得的对象存在,但是自己不持有对象。

  • 无法释放非自己持有的对象

释放非自己持有的对象会造成程序的崩溃。

GNUSTEP和APPLE中alloc/retain/release/dealloc的实现

在申请内存的时候,会在内存头部之前申请一块内存用来保存引用计数。然后分别在不同的操作的时候对这一引用计数值进行判断并作相应调整。总结如下:

1.调用alloc或是retain方法后,引用计数值加1。
2.调用release之后,引用计数值减1
3.引用计数值为0时,调用delloc方法废弃对象

苹果在实现上述方式时没有使用内存头部管理引用计数,而是使用采用了散列表管理引用计数

autorelease

自动释放--autorelease

aurorelease就是自动释放,类似于c语言中的自动变量。

autorelease的具体使用方法:

1,生成并持有NSAutoreleasePool对象
2,调用已分配对象的autorelease实例方法
3,废弃NSAutoreleasePool对象

在Cocoa框架中,相当于程序主循环的NSRunloop或者在其他程序可运行的地方,对NSAutoreleasePool对象进行生成,持有和废弃处理。

ARC规则

所有权修饰符:

  • _strong修饰符
  • _weak修饰符
  • _unsafe_unretained修饰符
  • _autoreleasing修饰符

_strong修饰符

_strong修饰符是id类型和对象类型默认的所有权修饰符。附有_strong修饰符的变量在超出其变量作用域时,释放其被赋予的对象。_strong修饰符表示对对象的“强引用”,持有强引用的变量在超出其作用域时被放弃,随着强引用的失效,引用的对象会随之释放。通过_strong修饰符,不必再次键入retain或者release,就完美的满足了“引用计数式内存管理的思考方式”。

注:id类型和对象类型的所有权修饰符默认为_strong修饰符。

_weak修饰符

如果仅使用_strong修饰符会造成“循环引用”的问题,这个时候就用到了_weak。带有_weak修饰符的变量不持有对象,所以在超出其变量作用域时,对象即被释放。_weak的另一个优点是,在持有某对象的弱引用时,若该对象被释放,则此弱引用将自动失效且处于nil被赋值状态。

_unsafe_unretained修饰符

在ios5以下版本中无法使用_weak,所以_unsafe_unretained成为替代品。但是_unsafe_unretained不保证最后的对象被释放,且处于nil被赋值状态。所以赋值给附有_unsafe_unretained修饰符变量的对象在使用时,要确保它存在。

_autoreleasing修饰符

在ARC有效时,用“@autoreleasepool块”来代替“NSAutoreleasePool”。

编译器会检查方法名是否以alloc/new/copy/mutableCopy开始,如果不是则自动将返回值的对象注册到autoreleasepool(注:init返回值的对象不注册到autoreleasepool)。在使用附有_weak修饰符的变量时必须访问注册到autoreleasepool的对象,因为_weak修饰符持有对象的弱引用,在访问引用对象的过程中,该对象可能被丢弃,所以把要访问的对象注册到autoreleasepool中,那么在@autoreleasepool结束之前多能确保该对象存在。

属性

      属性声明的属性                       所有权修饰符
        assign                          _unsafe_unretained
        copy                            _strong
        retain                          _strong
        strong                          _strong
        unsafe_unretained               _unsafe_unretained
        weak                            _weak

其中:
assign:一般基本变量用该属性声明,eg:int BOOL

copy:声明的变量是拷贝赋值源所生成的对象

retain和strong表示意思相同

strong:属性所声明的变量将成为对象的持有者

unsafe_unretained:ios5之前的系统用该属性代替weak

关于ARC认识很好的博文,一个系列,值得一读。

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

推荐阅读更多精彩内容