- Effective Objective-C 2.0 再读笔记(三
- Effective Objective-C 2.0 再读笔记(四
- Effective Objective-C 2.0笔记(二)
- Effective Objective-C 2.0笔记(一)
- Effective Objective-C 2.0笔记(三)
- Effective Objective-C 2.0笔记(五)
- Effective Objective-C 2.0 再读笔记(二
- 《Effective Objective-C 2.0》读书/实战
- 《Effective Objective-C 2.0 》 阅读笔
- Effective Objective-C 2.0 无废话精简篇
前篇回顾:
Effective Objective-C 2.0 再读笔记 (一)
Effective Objective-C 2.0 再读笔记 (二)
Effective Objective-C 2.0 再读笔记 (三)
第16条: 提供"全能初始化方法"
要点
- 在类中提供一个全能初始化方法, 并于文档中指明. 其他初始化方法均应调用此方法.
- 若全能初始化方法与超类不同, 则需复写超类中对应的方法
- 如果超类的初始化方法不实用与子类, 那么一个个覆写这个超类方法, 并在其中抛出异常
第17条: 实现 description 方法
要点
- 实现 description 方法返回一个有意义的字符串, 用以描述该实例
- 若想在调试时打印出更详尽的对象描述信息, 则应实现 debugDescription 方法
第18条: 尽量使用不可变对象
设计类的时候, 应充分运用属性来封装数据. 而在使用属性时, 则可将其声明为"只读"(read-only).默认情况下, 属性是"即可读又可写的"(read-write), 这样设计出的类都是可变的(nutable). 不过, 一般情况下我们要建模的数据未必需要改变, 所以尽量使用不可变对象.
具体到实际开发中, 则应该尽量把对外公开的属性设为只读, 而且只在确有必要时才将其属性对外公开.
要点
- 尽量创建不可变对象
- 若某属性仅可于对象内部修改, 则在"class-continuation"分类中将其由 readonly 属性扩展未 readwrite 属性
- 不要把可变的 collection 作为属性公开, 则应提相关方法, 以此修改对象中的可变 collection
第19条: 使用清晰而协调的命名方式
要点
- 起名时应遵从标准的 OC 命名规范, 这样创建出来的接口更容易为开发者所理解
- 方法名要言简意骇, 从左至右读起来要想日常用语的句子才好
- 方法名里不要使用缩略后的类型名称
- 给方法起名时的第一要务就是确保其风格与你自己的代码或者所要集成的框架相符.
第20条: 为私有方法名加前缀
这个作用很明了, 直接看要点
要点
- 给私有方法的名称加上前缀, 这样可以很容易的将其同公共方法区分开
- 不要单用一个下划线做私有方法的前缀, 因为这样的做法是预留给苹果公司使用的
第21条: 理解 Objective-C 错误模型
异常只用于处理严重错误, 而对于其他错误, 一般使用"委托方法"和 NSError 来处理.
NSError 的用法更加灵活, 因为经由此对象, 我们可以把导致错误的原因汇报给调用者. NSError 对象里封装了三条信息:
-
Error domain (错误范围, 其类型为字符串)
错误发生的范围. 也就是产生错误的根源, 通常用一个特有的全局变量来定义. 比方说, "处理 URL 的子系统"(URL-handling subsystem)在从 URL 中解析或取得数据时如果出错了, 那么就会使用 NSURLErrorDomain 来表示错误范围. -
Error code (错误码, 其类型为整数)
独有的错误码, 可以指明在某种范围内具体发生了何种错误. 某个特定范围内可能会发生一系列相关错误, 这些错误通常采用 enum 来定义. -
User info (用户信息, 其类型为字典)
有关此错误的额外信息, 其中或许包含一段"本地化的描述"(localized description), 或许还含有导致该错误发生的另一个错误, 经由此种信息, 可将相关错误串成一条"错误链"
要点
- 只有发生了导致整个应用程序崩溃的严重错误时, 才应该使用异常
- 在错误不那么严重的情况下, 可以指派"委托方法"来处理错误, 也可以把错误信息放在 NSError 对象里, 经由"输出参数"返回给调用者
第22条: 理解 NSCopying 协议
使用对象时经常需要拷贝它. 在 Objective-C 中, 此操作通过 copy 方法来完成, 而想要自己的类支持拷贝操作, 那就要实现 NSCopying 协议, 该协议只有一个方法:
- (id)copyWithZone:(NSZone *)zone
要点
- 若想令自己的所写的对象具有拷贝功能, 则需要实现 NSCopying 协议
- 如果自定义的对对象分为可变版本和不可变版本, 则需要分别实现 NSCopying 与 NSMutableCopying 协议
- 复制对象时需要决定采用浅拷贝还是深拷贝. 一般情况下采用浅拷贝
- 如果你所写的对象需要深拷贝, 那么可以考虑新增一个专门执行深拷贝的方法
网友评论