阅读Effective Object-C 2.0 笔记(五)

还是要好好学习英文啊,笔者只能看中文版的,下载地址如下:
http://download.csdn.net/detail/m6830098/7977521
看书的时候还是困的不行不行的-

今天来学习学习本书的第五章。

第一条:理解引用计数。引用计数工作原理,在引用计数架构下,对象有个计数器,用以表示当前有多少个事物想令此对象继续存在。NSObject协议中有三个方法用于操作计数器,以递增或递减其值:Retain 递增保留计数;release 递减保留计数; autorelease 待稍后清理"自动释放池(autorelease pool)"时,在递减保留计数。为了避免在不经意间使用了无效对象,一般调用完release之后都会清空指针。这就能保证不会出现可能指向无效对象的指针,这种情况通常称为"悬挂指针"(dangling pointer)。保留环:使用引用计数机制时,经常要注意的一个问题就是"保留环(retain cycle)",也就是呈现环状互相引用的对个对象,这将导致内存泄漏,因为循环中的对象其保留计数不会降为0.

第二条:以ARC简化引用计数。由系统自动执行retain、release、autorelease、dealloc操作。若方法名以下列词语开头,则其返回的对象归调用者所有:copy、new、alloc、mutableCopy。归调用者所有的意思是:调用上述四种方法的那段代码要负责释放方法所返回的对象。可用下列修饰符改变局部变量与实例变量的语义:1.
_ strong:默认语义,保留此值。2. unsafe unretained:不保留此值,这么做可能不安全,因为等到再次使用变量时,其对象可能已近回收了。3. _weak:不保留此值,但是变量可以安全使用,因为如果系统把这个对象回收了,那边变量也会自动清空。4.
_ _autoreleasing:把对象"按引用传递"(pass by reference)给方法时,使用这个特殊的修饰符。此值在方法返回时自动释放。在ARC环境下,dealloc方法可以像这样写:

- (void)dealloc {
    CFRelease(_coreFoundationObject);
    free(_heapAllocatedMemoryBlob);
}

注意:ARC只负责管理Object-C对象的内存。CoreFoundation对象不归ARC管理(因为他们是由纯C的API所生成的),开发者必须适时调用CFRetain/CFRelease。

第三条:在dealloc方法中只释放引用并解除监听。对象在经历其生命周期后,最终会为系统所回收,这时就要执行dealloc方法了。在每个对象的生命期内,此方法仅执行一次,也就是当保留计数降为0的时候。在dealloc方法中,通常还要做一件事,那就是把原来配置过的观测行为都清理掉。如果用NSNotificationCenter给此对象订阅(register)过某种通知,那么一般应该在这里注销,通知系统就不在把通知发给回收后的对象了,若还是向其发送通知,这会让应用程序崩溃。

  - (void)dealloc {
    CFRelease(_coreFoundationObject);
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

第四条:以弱引用来避免保留环。避免保留环的最佳方式就是弱引用。

第五条:以"自动释放池块"降低内存峰值。释放对象有两种方式:一种是调用release方法,使其保留计数立即递减;另一种是调用autorelease方法,将其加入"自动释放池"中。自动释放池用于存放那些需要在稍后某个时刻释放的对象。清空(drain)自动释放池时,系统会向其中的对象发送release消息。创建自动释放池的语法:

@autoreleasepool {
      //...
}

一般情况下无须担心自动释放池的创建问题,系统会自动创建一些线程,比如主线程或者"大中枢派发(Grand Central Disoatch,GCD)"机制中的线程,这些线程某人都有自动释放池,每次执行"事件循环(enent loop)"时,就会将其清空。当循环长度无法预知,必须取决于用户的输入时,如果不使用"自动释放池块",应用程序所占内存量就会持续上涨,而等到下一个事件时,所有临时对象都释放后内存量又会突然下降,这种情况不甚理想。如:要从数据库中读出许多对象,代码可能这么写:

NSArray *dataBaseRecords= /*   ...   */;
NSMutableArray *people = [NSMutableArray new];
for (NSDictionary *record in dataBaseRecords) {
    WWPerson *person = [WWPerson alloc] initWithRecord:record];
    [people addObject:person];
}

这个就会创建一些临时对象,若记录有很多条,则内存中也会有很多不必要的临时对象,它们本来应该是提早回收的。增加一个自动释放池既可解决问题。如果把循环内的代码包裹在"自动释放池块"中,那么在循环中自动释放的对象就会放在这个池,而不是主线程的主池里面。如:

NSArray *dataBaseRecords= /*   ...   */;
NSMutableArray *people = [NSMutableArray new];
for (NSDictionary *record in dataBaseRecords) {
    @autoreleasepool {
        WWPerson *person = [[WWPerson alloc] initWithRecord:record];
        [people addObject:person];
    }
}

自动释放池机制就像"栈(stack)"一样,系统创建好自动释放池之后就将其推入栈中,二清空自动释放池,曾相当于将其从栈中弹出。在对象上执行自动释放操作,就不等于将其方圆栈顶的那个池里。@autoreleasepool语法还有个好处:每个自动释放池均有其范围,可以避免我已经误用了那些在清空池后已为系统所回收的对象。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id object = [self createObject];
[pool drain];
[self useObject:object];

最后,本书一共7个章节,此为第五章节:内存管理。由于现在都使用ARC机制,所以本章有一些内容我没有列举下来。

共勉!一步一个巴掌印。。。。。

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

推荐阅读更多精彩内容