这本书非常的好,看完后,感触挺深,总结纪录一下,针对ios开发的备忘:
注:分类和原著有些不同,自己总结学习用的,仅供参考。
 
  • 系统篇:
  1. 了解oc起源:继承c,由Smalltalk演化而来。动态语言,运行期决。需要熟悉c语言。
     6.  理解变量属性 a.原子性 b.读写 c.内存管理语义 d.方法名 。尽量少用atomic .注意使用copy属性避免数据安全问题。 还有oc动态语言特性,硬编码问题。类内部不要直接访问变量。
     7.  还是重复了上一篇:在对象内部尽量直接访问实例变量。a.快,没有派发。b.避免copy复制属性。c.不会触发kvo。d.排错问题有点扯了。
     8.  对象等同问题。 isEqual机制原理。hash方法判断对象是否等同的逻辑。
     10.runtime机制的associatedObject.(关联对象),一般不用。
     11.理解objec_msgSend机制(消息传递机制)。还是动态语言特性。a.oc对象每个方法都可以视为简单的c函数。使用了尾递归优化了栈,避免过早栈溢出。
     12.理解消息转发机制,经常有:unrecognized selector sent to instance xxx的log。关键词:动态方法解析,系统框架自带的缓存方法机制原理。
     13.方法调配,黑盒子调试。看到这一篇的时候,我只是觉得作者有点丧心病狂,走火入魔了。
     14.理解“类对象”用意。a.对象isa指针的定义。b.判断对象类型方法,不用isEqual,可能有消息转发触发。
     21.理解错误类型。a.正确使用NSError。
     22.理解NSCopying协议。a.自定义对象实现copy功能。b.浅拷贝和深拷贝。
     23.通过委托和数据源协议进行对象间通信。a.使用观察者模式,要考虑weak属性(非持有)。b.可以实现含有位段的结构体存储信息。
     26.勿在分类中声明属性。category中不能添加变量的问题。可以用associate来解决。(runtime机制)尽量避免这种需求,代码会比较乱,作者说:经常有不可预知的bug。
     37.理解“块”这一概念。a.“堆栈块”的概念怀疑作者自己象形取的,就是注意块的引用范围问题,避免其被提前释放了。使用copy属性后,会复制到堆中。b.块也就是闭包语法。
     38.为常用的块类型创建typedef。
     47.熟悉系统框架(cocoa框架),Foundation框架,CFNetwork,CoreAudio,AVFoundation,CoreData,CoreText,TextKit,UIKit,QuartzCore(图形)等。同样是说了c的重要性。
    
  • 编码习惯篇:
     2.  在类的头文件尽量少引入其他头文件,原因:a.减少编译时间。b.避免相互引用的问题(import使用了一些预处理进行优化了)。使用@class来解耦(向前声明),实现class-continuation来实现细节隐藏(包括delegate, 或者独立申明一个文件,再引入,当然,还是可以轻易的被人down出来头文件的)
     3.  使用自带的糖语法(字面量语法)。这里只说一下注意点:
          
     4.  多用类型常量,’少用’#define. a.类型问题 不可以避免修改。还是要根据代码需求进行处理。例如: a.#define UNLog(xx, ...) NSLog(@“”) b.书中很多地方提到的命名问题
     15.用前缀避免命名空间冲突。还是命名问题,作者再次强调了。
     18.尽量使用不可变对象。a.尽量创建readonly对象,可以在class-cotinuation中修改成readwrite。b.主要问题是容易造成数据安全的问题。
     19.使用侵袭而协调的命名方式。还是命名问题。
     20.为私有方法名家前缀。还是命名问题,估摸着,作者应该是被命名不好的同学这么惨了。
     25.总是为第三方的分类名称加前缀。还是命名,这一点,做过sdk的同学应该感触很深。
     27.使用“class-continuation分类”隐藏实现细节。看到这标题,有种作者在凑字数的错觉。
 
  • 代码逻辑优化篇:
     5.  使用枚举,选项,状态代码. 注意一下枚举是会自增1的。(DRY)
     9.  使用抽象工厂模式,创建类族。
     16.提供“全能初始化方法”。a.文档说明 b.注意子类父类的继承覆写问题。
     17.实现description方法。这里让我想到了另一个问题:如何将自定义的object存到NSUserDefault。也是一样的解决思路的。
     24.将嘞的实现代码分散到便于管理的数个分类之中。
     28.通过协议提供匿名对象。使用匿名对象来隐藏类型名称l。
     39.用handler块降低代码分散程度条的应用。
     40.用块引用其所属对象时不要出现保留环。
     41.多用派发队列,少用同步锁。
     42.多用GCD,少用performSelector系列方法。
     43.掌握GCD及操作队列的使用时机。
     44.通过Dispatch Group机制,根据系统资源状况来执行任务。
     45.使用dispatch_once来执行只需要运行一次的线程安全代码。a.注意一下滥用单例的问题。
     46.不要使用dispatch_get_current_queue。a.应该做调试用。*慎用。
     48.多用枚举,少用for循环。
     49.对自定义其内存管理语义的collection使用无缝桥接。
     50.构建缓存时选用NSCache而非NSDictionary。a.自动释放资源。“线程安全”。可以控制内存。b.注意缓存,加快响应速度。
     51.精简initialize与load的实现代码。提高响应速度,避免“依赖环”的几率。
     52.别忘了NSTimer会保留其目标对象。ps:ALL
 
  • 内存管理篇:
    29.理解引用计数。理解基本的对象引用计数,资源释放回收,weak引用问题,循环应用,锁的问题。(又是混字数的)
     30.以ARC简化引用计数。a.__unsafe_unretained与weak的区别。b.__weak关键字。c.常见的释放资源问题。例如非oc对象的释放问题。
     31.在dealloc方法中只释放引用并解除监听。a.delloc方法中,注意一些KVO.NSNotification的解除问题。b.文件流的引用关闭问题。c.delloc代码段表明已经在回收了。
     32.编写“异常安全代码”时留意内存管理问题。try代码中会有泄漏问题。其实都发生了catch了,泄漏了已经不重要了。那个辅助功能也是鸡肋,没机会用的赶脚。
     33.以弱引用避免保留环。看到这个标题,感觉作者又来混字数的。读完感觉也是这样。DRY。
     34.以“自动释放池块”降低内存峰值。a.使用@autoreleasepool (貌似也没有用上的机会的赶脚)
     35.用“僵尸对象”调试内存管理问题。a.常见的僵尸模式调试以及全局异常断点。b.僵尸模式的实现原理。通过修改isa指针,避免释放等一系列操作,终止程序。
     36.不要使用retainCount。a.ARC下已经废弃。
 
读后感:本书讲的东西,有一些地方不免重复。很多东西其实都在平时阅读的源码中体现了。以至于让我错以为:“本来就是这样的”。
感谢作者写出这样的书来分享自己的经验,非常感谢。

Effective objective-c 2.0阅读笔记的更多相关文章

  1. The Implementation of Lua 5.0 阅读笔记(一)

    没想到Lua的作者理论水平这么高,这篇文章读的我顿生高屋建瓴之感.云风分享了一篇中译:http://www.codingnow.com/2000/download/The%20Implementati ...

  2. The implementation of Lua 5.0 阅读笔记(二)

    6 线程和协程 读完这篇文章我才意识到python的协程到底缺了什么,这个就是coroutine和semi-coroutine的区别了.区别就是,semi-coroutine只能返回(yield)到调 ...

  3. skynet1.0阅读笔记2_skynet的消息投递skynet.call

    为了了解 skynet.call 的调用过程,需要先看看 skynet的队列是如何把包分到不同工作线程的.看下图 查看 global_queue 的skynet_globalmq_push和skyne ...

  4. skynet1.0阅读笔记_skynet的启动

    首先看skynet的启动,函数入口在 skynet_main.c 的main(),其中最重要的是: skynet_start(&config); 在skynet_start中做了两个启动: / ...

  5. 《C# 6.0 本质论》 阅读笔记

    <C# 6.0 本质论> 阅读笔记   阅读笔记不是讲述这本书的内容,只是提取了其中一部分我认为比较重要或者还没有掌握的知识,所以如果有错误或者模糊之处,请指正,谢谢! 对于C# 6.0才 ...

  6. Linux 0.11源码阅读笔记-文件管理

    Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...

  7. Linux 0.11源码阅读笔记-中断过程

    Linux 0.11源码阅读笔记-中断过程 是什么中断 中断发生时,计算机会停止当前运行的程序,转而执行中断处理程序,然后再返回原被中断的程序继续运行.中断包括硬件中断和软件中断,硬中断是由外设自动产 ...

  8. Linux 0.11源码阅读笔记-总览

    Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...

  9. SDL源码阅读笔记(1) 基本模块

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 前言 对于大牛来说,写关于阅读源码的文章都会叫源码剖析或者深入浅出啥的,对于我,自己阅读阅读源码,写 ...

随机推荐

  1. div四个边框分别设置阴影样式

    对于div边框的阴影一直没有很好地理解,也一直不明白怎么给四个边框分别设置阴影.昨天项目中碰到了这个问题,就认真想了一下,在此总结一二. 首先,还是从官方解释说起. 网上的解释通常都是什么水平阴影长度 ...

  2. Python-Mac 安装 PyQt4

    环境: 系统: OS X 10.11.4 Python: 2.7.10 1.安装 Qt brew install qt 测试安装结果,需要正确找到 qmake 的路径 qmake 2.安装 SIP 下 ...

  3. 使用IntelliJ IDEA 配置Maven(入门)(转)

    原文转自:http://blog.csdn.net/qq_32588349/article/details/51461182 1. 下载Maven 官方地址:http://maven.apache.o ...

  4. 用dos命令备份和恢复sql server 数据库

    这里是批处理命令-----备份的 delete d:\restore\cw_ft.bak delete d:\restore\cw_sd.bak sqlcmd -i "bak.sql&quo ...

  5. 【linux】 解决linux下vsftp 500 OOPS: cannot change directory:/home/ftp/ 办法

    用FileZilla连接ftp出现错误,500 OOPS: cannot change directory:/home/ftp 原因是CentOS系统安装了SELinux,因为默认下是没有开启FTP的 ...

  6. Xcode编程环境经验笔记(持续汇总)

    1.工程路径设置(Search Paths) Header Search Paths:$(SRCROOT)/include Library Search Paths:$(SRCROOT)/lib $( ...

  7. [Linux] - Docker 常用命令

    # 运行docker # -it表示前端运行 docker run -it centos /bin/echo haha # 后端运行并映射80端口 docker run -dt -p : --name ...

  8. jquery 通知页面变化

    var PageTitleNotification = { Vars: { OriginalTitle: document.title, Interval: null, IsNotificationE ...

  9. vi 颜色配置

    一.vi 默认黑色背景上,蓝色注释很难看不清,必须重新设置. (1)查看vi支持的配色方案: $ ls /usr/share/vim/vim72/colors (2)支持如下方案: blue.vim ...

  10. (C++) LNK2019: unresolved external symbol.

    Error 33 error LNK2019: unresolved external symbol "\xxx.obj yyy.Native 仔细看看错误信息,后来发现尽然是构造函数的一个 ...