Effective Objective-C 2.0 读书笔记

Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法

第1章 熟悉Objective-C

第1条:了解Objective-C语言的起源
第2条:在类的头文件中尽量少引入其他头文件
  • 需要引入许多用不到的内容,增加编译时间

  • 循环引用,使用import不会像include那样发生编译死循环,但是会导致两个类中有一个类无法被正确编译

第3条:多用字面量
  • 好处
    • 缩减代码长度,更易读
    • 使用下标或键来访问容器中的数据
  • 注意:值为nil时会抛出异常
第4条:多用类型常量,少用#define

建议用常量:

  • 可能会被重新定义值
  • 没有类型信息,编译器无法优化

在Objective-C每个类的实现文件都是一个编译单元

  • 内部常量 static NSString * const name = @"value";

  • 外部常量 .h文件:extern NSString *const name; .m文件:NSString *const name = @"value";

第5条:用枚举标识状态、选项、状态码
enum State {
    StateA,
    StateB,
    StateC,
 }

 enum State : NSInteger {
    StateA,
    StateB,
    StateC,
 }

第2章 对象、消息、运行期

第6条:理解“属性”这一概念

property、synthesize、dynamic

属性特质:原子性、读写权限、内存管理、方法名指定

第7条:在对象内部尽量直接访问实例变量
  • 不经过“方法派发”步骤,访问速度较快
  • 不会调用其setter,绕过了相关属性定义的“内存管理语义”
  • 不会触发KVO通知
  • 通过属性来访问有助于排查与之相关错误
  • init和dealloc中使用实例变量访问
第8条:理解“对象等同性”这一概念

== 比较的是两个指针本身

isEqual 指针值相等且对象类型和对象的所有属性都相等

特殊等同性判断方法

isEqualToAnotherPerson

1、==

2、类型

3、属性

第9条:以”类族模式“隐藏实现细节

abstract 抽象基类

第10条:在既有类中使用关联对象存放自定义数据

Associated Object 关联对象

第11条:理解objc_msgSend的作用
  • 传递消息,消息有 名称 和 选择器,可以接受参数,可能还有返回值
  • C语言函数调用方式,静态绑定,编译期决定运行时所应调用的函数
  • oc,向某对象传递消息,使用动态绑定机制来决定需要调用的方法
  • objc_msgSend函数会依据接受者与选择器的类型来调用适当的方法。
    • 在接受者所属类中搜寻方法列表,找到就调用,找不到沿着继承体系向上查找,找到合适方法,执行调用
    • 最终还是找不到,执行消息转发(message forwarding)
    • 快速映射表,objc_msgSend会将匹配结果缓存在快速映射表里面,如若再次向该类发送与选择器相同的消息,执行速度加快
  • objc_msgSend_stret 返回结构体
  • objc_msgSend_fpret 返回浮点数
  • objc_msgSendSuper 给超累发消息
第12条:理解消息转发机制

消息转发:

  1. 动态方法解析:先征询接受者所属的类,看其能否动态添加方法,用来处理当前这个”未知的选择器“
  2. 完整的消息转发机制,运行时系统请求接收者以其他手段来处理与消息相关的方法调用
    1. 请接收者看看有没有其他对象能处理,若有,则运行时系统会把消息转发给那个对象,消息转发过程结束
    2. 如果没有可替代的接收者,则启动完成的消息转发机制,运行时系统会把与消息有关的全部细节都封装到NSInvocation对象中,再给接收者最后一次机会,

动态方法解析:

  1. 对象接收到无法解读的消息,首先调用其所属类的下列类方法:

    +(BOOL)resolveInstanceMethod:(SEL)selector
    +(BOOL)resolveClassMethod:(SEL)selector
    

    表示该类是否能新增一个实例方法或类方法用来处理这个选择器

  2. 当前接收者还有第二次机会能处理未知的选择器,在这一步中,运行时系统会询问接收者能不能把这条消息转发给其他接收者来处理,对应方法

    - (id)forwardingTargetForSelector:(SEL)selector
    

    模拟多重继承的某些特性

消息转发全流程:

以完整的例子演示动态方法解析:

第13条:使用“方法调配技术”调试“黑盒方法”

Method Swizzling 方法调配

交换两个方法的实现

黑盒方法增加新功能

调试黑盒方法

method_exchangeImplementations(oriMethod, swapMethod)
第14条:理解“类对象”的用意

对象的构成

  • oc对象都是c语言结构体实现的
  • 每个对象结构体的首个成员是Class类的变量。该变量定义了对象所属的类,通常称为is-a指针
  • Class类结构体中存放类的“元数据”,例如实例方法,实例变量,它的结构体的首个变量也是is-a指针,由此说明Class本身亦为oc对象
  • 结构体中还有一个变量,叫super_class,它定义了本类的超类。类对象所属的类型是另外一个雷类,叫做“元类”(metaclass),用来表述类对象本身所具备的元数据。“类方法”就定义在元类中
  • 每个类仅有一个类对象,每个类对象仅有一个与之相关的元类

类继承体系中查询类型信息

isMemberOfClass
isKindOfClass

第3章:接口与API设计

第15条:用前缀避免命名空间冲突
  • 没有命名空间机制(namespace),命名冲突导致链接错误
  • 前缀尽量大于2,苹果保留使用所有两字母前缀。TW,iOS5 twitter,TWRequest
  • 类、分类、分类方法
  • 类实现文件中的的纯C函数及全局变量,这些名称都算作“顶级符号”
第16条:提供“全能初始化方法”
  • designated,指定初始化方法或全能初始化方法
  • 在类中提供一个全能初始化方法,并于文档中指明。其他初始化方法均应调用此方法
  • 子类的全能初始化方法与超类方法的名称不用,那么总应覆写超类的全能初始化方法
  • 如果超类初始化方法不适用于子类,那么应该覆写这个超类方法,并在其中跑出异常
第17条:实现description方法
  • 实现description方法返回一个有意义的字符串,用以描述该实例

    @“<类名: 指针> %@”   [self class], self, @{varName: var}
    
  • debugDescription用于调试打印

第18条:尽量使用不可变对象
  • 尽量使用只读,使用read-write设计出来的类都是可变的
  • 若某属性仅可用于对象内部修改,则在分类中覆写权限
  • 不要把可变的集合作为属性公开,应提供相关方法,以此修改对象中的可变集合
第19条:使用清晰而协调的命名方式
第20条:为私有方法名加前缀
  • 区分共有方法和私有方法
  • p_privateMethod
第21条:理解oc错误模型

异常机制 exception

第22条:理解NSCopying协议
  • NSZone,以前开发程序时,会据此把程序分为不同的区,而对象会创建在某个区里面。现在不用了,每个程序只有一个区:“默认区”(default zone)尽管必须实现这个方法,但是不用关心其中的zone参数
  • 类实现拷贝功能,需声明该类实现“copyWithZone”方法
  • 深浅拷贝,绝大多数Foundation对象执行的都是浅拷贝

第4章:协议与分类

protocol ~~ interface

第23条:通过委托与数据源协议进行对象间通信

委托模式 --> Delegate Pattern

  • 定义一套接口(一系列方法),某对象A若想接受对象B的委托,则需遵从此接口,以便成为其委托对象,
    • 对象B可以给委托对象回传一些信息
    • 对象B可以在发生相关事件时通知委托对象

循环引用

结构体缓存是否响应相关协议方法

第24条:将类的实现代码分散到便于管理的数个分类之中
  • 类的基本要素(属性、初始化方法)声明在主实现中
第25条:总是为第三方类的分类名称加前缀
  • 分类名称+前缀
  • 分类方法+前缀
第26条:不要再分类中声明属性
第27条:使用匿名分类,隐藏实现细节
  • 只对外公布必须公布的部分
第28条:通过协议提供匿名对象
  • id对象 ==> 匿名对象
  • 隐藏类型名称

第5章:内存管理

第29条:理解引用计数

转载于:https://my.oschina.net/KeepDoing/blog/2989945

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值