这本书非常的好,看完后,感触挺深,总结纪录一下,针对ios开发的备忘:
注:分类和原著有些不同,自己总结学习用的,仅供参考。
- 了解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下已经废弃。
读后感:本书讲的东西,有一些地方不免重复。很多东西其实都在平时阅读的源码中体现了。以至于让我错以为:“本来就是这样的”。
感谢作者写出这样的书来分享自己的经验,非常感谢。
- The Implementation of Lua 5.0 阅读笔记(一)
没想到Lua的作者理论水平这么高,这篇文章读的我顿生高屋建瓴之感.云风分享了一篇中译:http://www.codingnow.com/2000/download/The%20Implementati ...
- The implementation of Lua 5.0 阅读笔记(二)
6 线程和协程 读完这篇文章我才意识到python的协程到底缺了什么,这个就是coroutine和semi-coroutine的区别了.区别就是,semi-coroutine只能返回(yield)到调 ...
- skynet1.0阅读笔记2_skynet的消息投递skynet.call
为了了解 skynet.call 的调用过程,需要先看看 skynet的队列是如何把包分到不同工作线程的.看下图 查看 global_queue 的skynet_globalmq_push和skyne ...
- skynet1.0阅读笔记_skynet的启动
首先看skynet的启动,函数入口在 skynet_main.c 的main(),其中最重要的是: skynet_start(&config); 在skynet_start中做了两个启动: / ...
- 《C# 6.0 本质论》 阅读笔记
<C# 6.0 本质论> 阅读笔记 阅读笔记不是讲述这本书的内容,只是提取了其中一部分我认为比较重要或者还没有掌握的知识,所以如果有错误或者模糊之处,请指正,谢谢! 对于C# 6.0才 ...
- Linux 0.11源码阅读笔记-文件管理
Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...
- Linux 0.11源码阅读笔记-中断过程
Linux 0.11源码阅读笔记-中断过程 是什么中断 中断发生时,计算机会停止当前运行的程序,转而执行中断处理程序,然后再返回原被中断的程序继续运行.中断包括硬件中断和软件中断,硬中断是由外设自动产 ...
- Linux 0.11源码阅读笔记-总览
Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...
- SDL源码阅读笔记(1) 基本模块
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 前言 对于大牛来说,写关于阅读源码的文章都会叫源码剖析或者深入浅出啥的,对于我,自己阅读阅读源码,写 ...
随机推荐
- 前端学习 第三弹: JavaScript语言的特性与发展
前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...
- @SuppressWarnings("deprecation")
在Java编译过程中会出现很多警告,有很多是安全的,但是每次编译有很多警告影响我们对error的过滤和修改,我们可以在代码中加上 @SuppressWarnings("XXXX") ...
- kaungbin_DP S (POJ 3666) Making the Grade
Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...
- pwnable echo1
最近忙的好久没有更新了,有空把之前拿来练手的CTF pwn题逐渐整理一下放出来 题目是 linux 64位程序 ,流程很简单,大致思路就是先把一个跳转的机器指令写进name的地址,然后溢出覆盖eip, ...
- 子句jion
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- js 防止页面后退的方法
//防止页面后退 history.pushState(null, null, document.URL); window.addEventListener('popstate', function ( ...
- 任务型sql
一.创建表空间与用户,因为数据文件没有指定路径,所以需要修改数据文件路径,才有了下面的需求. create tablespace wo datafile 'wo.dbf' size 20m;creat ...
- centos nginx server_name 配置域名访问规则
今天配置Server_name时,希望禁用一些域名,应为这些域名我想让通过另外一个Server配置 server_name "~^((\w*[^w]{1}\w*)|w{1,2})\.hell ...
- 【java】之joda-time的使用
Joda-Time Home:http://joda-time.sourceforge.net/ JavaDoc:http://joda-time.sourceforge.net/apidocs/in ...
- 开源共享一个训练好的中文词向量(语料是维基百科的内容,大概1G多一点)
使用gensim的word2vec训练了一个词向量. 语料是1G多的维基百科,感觉词向量的质量还不错,共享出来,希望对大家有用. 下载地址是: http://pan.baidu.com/s/1boPm ...