中文: 编写高质量iOS与OS X代码的52个有效方法
整体评价: 书中提出了52条建议,如果都能遵守的话,对码代码还是很有帮助的。书中记录的有些东西,现在看有点老,不过很具有参考性。如果感觉飞时间的话,直接翻看每一章最后面的【要点】总结
我把52条,稍微整理了一下,也算是,自己的一些想法吧,就是写着玩的,参考下就完事。
第1条:了解Object-C语言的起源 -- 简单介绍,可以忽略的
第2条: 在类的头文件中尽量少引入其他头文件 -- .h文件中,尽量用@class,少用#import -- 降低耦合,稍微的提供编译效率
第3条: 多用字面量语法,少用与之等价的方法 -- 直接赋值,就好了,不要总是 [xxx alloc] init], 多用下标方式访问。(这一条估计大家都会遵守,可以忽略)
例如:
NSString str = @"111" array[0] = @"111" dict["age"] = 1
第4条: 多用类型常量,少用#define预处理指令 -- #define定义出来相同的东西,系统不会报错。个人经历:我们在项目中,会吧宏定义在一个专门的文件中,这样方便管理
例如: #define KTimeout 0.3 ==> static const NStimeInterval KTimeout = 0.3;
第5条: 多用枚举
两种情况: true/false 两种以上: enum
第6条: 理解 "属性" 这一概念 -- @property (nonatomic, assing/strong/weak/copy)
第7条: 在对象内部尽量直接访问实例变量
第8条: 理解 "对象等同性" 这一概念 -- isEqualToString / == 的区别
第9条: 以 "类族模式" 隐藏实现细节 -- 封装方法,提供统一的对外访问接口
第10条: 在既有类中使用关联对象存放自定义数据 -- 不理解,看官自己研究吧。哈哈哈
例如: objc_setAssociatedObject(xxx,xxx,...)
第11 条: 理解 objc_msgSend的作用 -- 如题
第12条: 理解消息转发机制 -- 如题
第13条:用 "用方法调配技术" 调试 "黑盒方法" -- runtime 的一些用法
第14条: 理解 "类对象" 的用意 -- isa 的简单解释
第15条: 用前缀避免命名空间冲突 -- 在使用前缀时,尽量用三个字母以上,两个字母是苹果的预留,将来可能会有冲突
第16条: 提供 "全能初始化方法" -- 基类,或者基础方法,所有方法都来调用它。我们可以在网络层,封装一个这样的方法,用来统一处理网络请求
第17 条:实现description方法 -- 仁者见仁,自己在项目中貌似没有实现过这个方法, 更习惯 po model 来查看
第18条: 尽量使用不可变对象 -- .h readOnly .m readWrite 这样写更安全,大家可以试试看,我现在就在用这种方法
第19条: 使用清晰而协调的命名方式 -- 好的方法明,等于注释。但是,国人的英语拼写出来的方法名,真的是。。。 个人建议: 适当注释,尤其是逻辑注释
第20条: 为私有方法名加前缀 -- 好想法,但是总是忘记,哈哈哈,
例如: - (void) p_privateMethod
第21条: 理解 Object-C 错误模型 -- 错误机制,可以看看
第22条: 理解 NSCopying 协议 -- 如题
第23条: 通过委托与数据源协议进行对象间通信 -- 典型的像 UITableviewDelegate/Datasource,另外在自己定义的时候,可以考虑用block
第24条: 将类的实现代码分散到便于管理的数个分类之中 -- 瘦身,拆分,网上有好多方法
第25条: 总是为第三方类的分类名称加前缀 -- 防止冲突
第26条: 勿在分类中声明属性 -- 如题
第27 条:使用 "class-continuation分类" 隐藏实现细节
例如: @interface Demo() {
NSString *demoStr = @""
}
@end
第28条: 通过协议提供匿名对象 -- 代理方式的运用
第29条: 理解引用计数 -- ARC
第30条: 以 ARC 简化引用技术 -- 如题
第31条: 在 dealloc 方法中只释放引用并解除监听 -- 释放,通知,KVO,还可以测试循环引用
第32条: 编写 "异常安全代码" 时留意内存管理问题 -- try{} catch{} finally{}
第33条: 以弱引用避免保留环 -- 感觉翻译的不太好,其实就是解决 循环引用 问题
第34条: 以 "自动释放池块" 降低内存峰值 -- 自己很少用 @autoreleassepoll ,理解下
第35条: 用 "僵尸对象" 调试内存管理问题 -- 利用 xcode 自带工具检测
第36条: 不用使用 retainCount -- 保留计数,用来查看某对象的计数器,貌似已经废除掉了
第37 条:理解 "块" 这一概念 -- block 的各种优缺点与写法
例如: void (^myBlock)(int a, int b)
第38条: 为常用的块类型创建 typedef -- 方便调用
例如: typedef int(^SuccessBlock)(BOOL flag, NSError *error)
SuccessBlock blcok = ^ (BOOL flag, NSError * err) { // do something};
- (void) doSomeThingWithCompletion:(SuccessBlock) completion
第39条: 用 handler 块降低代码分散程度 -- block
第40条: 用块引用其所属对象时不要出现保留环 -- 使用 block 时,避免循环引用 weakSelf
第41条: 多用派发队列,少用同步锁 -- GCD
第42条: 多用GCD,少用 performSelector 系列方法 -- 如题
第43条: 掌握 GCD 及操作队列的使用时机 -- 如题
第44条: 通过 Dispatch Group 机制,根据系统资源状况来执行任务 -- 可以看看,说不定哪一天突然用到了
第45条: 使用 dispatch_once 来执行只需要运行一次的现成安全代码 -- 单例
第46条: 不要使用 dispatch_get_current_queue -- 如题
第47 条:熟悉系统框架 -- 忽略
第48条: 多用块枚举,少用 for循环 --
第49条: 对自定义内存管理语义的 collection 使用无缝桥接 -- Object-C 与 C 互相调用, __bridge
第50条: 构建缓存时选用 NSCache 而非 NSDictionary -- NSCache 可以自动清除,线程安全
第51条: 精简 initialize 与 load 的实现代码
第52条: 别忘了 NSTimer 会保留其目标对象 -- 注意关闭计时器
呜呜,累死了,终于写完了,其实洗完发现也并没有什么用,就是自己写着玩而已,方便以后看的时候,通过一句话就想起来,要怎么做才好。
就先这样吧。闪啦