Effective Objective-C 2.0 笔记

Effective Objective-C 2.0

===

第52条 NSTimer引用

  • 使用block语法代替iOS10支持
  • iOS10以前
@implementation NSTimer
+(NSTimer *)ll_scheduledTimerWithTimeInterval:(NSTimeInterval)ti 
                                     block:(void (^)())block
                                      repeats:(BOOL)yesOrNo{
    [self scheduledTimerWithTimeInterval:ti 
                                  target:self 
                                selector:@selector(ll_timerblock:) 
                                userInfo:[block copy] 
                                repeats:(BOOL)yesOrNo];
}
+(NSTimer *)ll_timerblock:(NSTimer*)timer {
    void (^block)() = if(timer.userInfo);
    if(block){
        block();
    }
}
@end

第51条 +load和+initialize

+load +initialize
运行时机 程序启动时 第一次调用时
调用父类 �子类不实现+load不会调用父类+load 子类不实现会调用父类+initialize
分类 分类实现了+load先调基类,再调分类 子类实现了+initialize,先调超类,再调自身,通常要判断类型是否等于自身
实际应用 方法交换 初始化编译时不能确定的全局变量如NSMutableArray,或者单例模式使用前执行必要的初始化动作。


注意事项

  • initialize运行时线程安全,运行线程不确定。
  • 尽量避免在两种方法里面执行耗时操作
    — 尽量避免在两种方法里面调用其他类或方法,有可能会出现互相依赖导致未能正确初始化的情况。

第50条 构建缓存时选用NSCache而非NSDictionary

NSCache NSDictionary
自动删除 Y (LRU) N
拷贝Key N Y
线程安全 Y N

第49条 对自定义其内存管理语义的 collection 使用无缝桥接

  • 代码演示
    NSArray *anNSArray = @[@1,@2,@3,@4,@5];
    CFArrayRef aCFArray = (__bridge CFArrayRef)anNSArray;
    NSLog(@"Size of array = %li",CFArrayGetCount(aCFArray));
    //Output: Size of array = 5
__bridge 保留ARC所有权
__bridge_retained 交出ARC所有权
__bridge_transfer CF对象转OC对象所有权交给ARC
  • 例如使用CFMutableDictionary创建出保留key的Dictionary

第48条 多用块枚举,少用for循环

  • Objective-C 1.0反向枚举器
NSArray *anArray = /* ... */;
NSEnumerator *enumerator = [anArray reverseObjectEnumerator];
id object;
while((object = [enumerator nextObject]) != nil) {
     //do something with 'object'
}
  • 快速遍历
NSArray *anArray = /*...*/;
for (id object in anArray) {
    //do something with 'object'
}
  • 自定义快速遍历需要�NSFastEnumeration协议
//实现协议方法
- (NSUInteger) countByEnumeratingWithState:(NSFastEnumerationState*)state
                                   objects:(id*)stackbuffer
                                   count:(NSUInteger)length
  • Objective-C 2.0快速反向遍历

    缺点:拿不到下标
NSArray *anArray = /*...*/;
for (id object in [anArray reverseObjectEnumerator]) {
     //do something with 'object'
}
  • 基于块的遍历方式
NSArray *anArray = /*...*/;
[anArray enumerateObjectsUsingBlock:
    ^(id object, NSUInteger idx, BOOL *stop){
        //do something with 'object'
        if(shouldStop) {
            *stop = YES;
        }
    }];
  • 可以使用NSEnumerationOptions类型

    NSEnumerationReverse 反向遍历

    NSEnumerationConcurrent 并发遍历

第47条 熟悉系统框架

NSLinguisticTagger 解析字符串并找到其中的全部名词,动词,代词
CFNetwork C语言网络通信框架
CoreAudio C语言Api操作设备伤的音频硬件框架
AVFoundation 回放并录制音频视频
CoreData Objective-C对象持久化框架
CoreText C语言接口文字排版及渲染

第46条 不要使用 dispatch_get_current_queue

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