Chapter 1 Accustoming Yourself to Objective-c
Item 1 Familiarize Yourself to Objective-C
- 1 对于OC的简介
- 2 OC是C的超集,添加了面向对象特征
- 3 OC是一门动态语言,结合了runtime这一特点
- 4 提前了解了C会对学习OC有很大帮助
Item 2 Minimize Importing Headers in Headers
- 1 对于头文件的导入要谨慎,如果只是单纯的引用,请选择@Class,对于协议请在implementation中用扩展,可以减少compile 时间
- 2 书中的class-continuation 即指class-Extension 意为 扩展/分类 一种方式
Item 3 Prefer Literal Syntax over the Equivalent Methods
- 1 语法更简洁
- NSArray *array = @[@”1”,@”3”];
- NSNumber *someNumber = @1;
- NSDictionary *dic = @{@”1”:@”1”}; key-value 进行排列,相对于原来的DictionaryWithObjectsAndKeys更友好,可以直接用下标NSString *numberStr = someNumber[1];字典也是
- 2 字面意思语法 字典和数组中不能有空值nil,可以更好的鉴别nil类型的对象,对于可空的数组和字典慎用…
Item 4 Prefer Typed Constants to Preprocesser #define
- 1 避免使用没必要的宏定义,可以选择使用 static const 常量代替,因为使用#define 我们无法看到具体的类型信息,且导入有#define的 .h文件,可能会重复定义宏且没有警告(貌似现在Xcode的版本有警告 -.-)
- 2 使用static const 在implementation文件中,将不会暴露在全局符号表中(global symbol table),所以并不需要命名空间…不是很理解命名空间的意思
- 3 定义全局常量在头文件中,并且与implementation文件关联(这里推荐使用Foundation_extern 具体参考stackOverflow XD…),这常量将会出现在全局符号表中(data 区),但是给常量命名的时候建议前面加上类名
Item 5 Use Enumerations for states,Options, and Status Code
- 1 就是告诉我们要多使用新版的枚举 ,取名字要简单易懂,学会NS_Options -.-
- 2 在使用NS_ENUMS 和 NS_OPTIONS 时,要给一个简单明了的值类型
- 3 如果使用枚举的情况下,使用switch进行情形switch,这时候千万不要使用default选项,因为出现异常会无法捕捉
Chapter 2 Objects, Messaging, and the Runtime
Item 6 Understand Properties
本来这一小节写完了的,pro 突然关机了…
- 1讲了实例变量的偏移量(offset) ,@property 的本质,还有property里面的 property attribute ,assign weak strong unretain_unsafe atomic对性能的影响 copy等,还有可以改写 setter getter
- 2 @property语法提供了一种对象封装数据的方法
- 3 属性特质为数据存储 提供正确的语义
- 4 在设置属性所对应的实例对象时,一定要遵从该属性所声明的语义
- 5 在不需要保证数据安全的情况下,iOS开发尽量使用nonatomic,MACOS 影响不大
Item 7 Access Instance Variables Primarily Directly When Accessing Them Internally
- 1 直接访问实例变量速度更快,不需要通过oc的消息传递机制(详见第11小节)
- 2 不会执行相关的属性特质如copy,nonatomic之类
- 3 不会触发kvo(也许是坏事)
- 4 当然如果想要更好的检测bug,通过@property是个不错的办法,使用setter and getter更好,并能更好的掌控整个过程
- 5 在初始化或者dealloc时总是应该访问实例变量
- 6 有继承于自定义的父类时,使用@property和实例变量应该很好的做出衡量
- 7 赖加载切记doy syntax!
- 8 根据书中的建议,推荐写入数据多用点语法,读取多用实例变量
Item 8 Understand Object Equality
一般有以下两种方法
- 1
- (BOOL)isEqual:(id)object ;
- 2
- (NSUInteger)hash ;
下面是简单的知识点
- 1 使用equal方法,可重写方法 在里面进行多种判断
- 2 hash值方法,一般每个对象都是有唯一的hash值,但是两个hash值相等,对象没必要一定相等,hash方法书上提供了三种,集合中会检查各个对象的hash值,对性能会有影响
- 3 对象如果要相等一定要有相同的hash值,但是有相同的hash值不一定是相同的对象(可以手动改hash值,让其相等)
- 4 有效的使用相等方法比盲目的测所有属性值是否相等要好很多
- 5 写hash方法将提供很快但也存在低级别的冲突
Item 9 Use the Class CLuster Pattern to Hide Implementation Detail
- 1 类簇模式可以在一个简单的接口后面隐藏实现细节
- 2 类簇大多数用于系统的framwork
- 3 注意类簇的公共基类和文档说明,如果有你需要去读
Item 10 Use Associated Objects to Attach Custom Data to Existing Classes
1 可以关联一个属性,方法如下
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
//参数void *key 传个c语言的字符串即可 static void *key = “KEY”;
objc_getAssociatedObject(id object, const void *key)
objc_removeAssociatedObjects(id object)
2 可以给变量临时增加一个block进行回调,书中作者推荐使用子类alterView附带block属性进行回调(同感,作者很早就会响应式编程了…),缺点是可能会引起循环引用,并且bug很难找
- 3 使用关联方法可以使两个对象建立连接
- 4 且关联对象的内存管理语义也可以效仿拥有和非拥有关系
- 5 关联对象应该被用于不存在的方法,即使他们能轻易出现难以发现的BUG
(书上做笔记好了…)