Effective Objective-C 2.0 学习笔记 第

2018-12-21  本文已影响6人  TAsama

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

接口与API设计

15. 用前缀避免命名空间冲突

16. 提供“全能初始化方法”

我们把可为对象提供必要信息,以便其能完成工作的初始化方法叫做“全能初始化方法”。比如UITableViewCell,初始化时要指明复用标识符。
如果创建类实例的方法不止一种,那么这个类就会有多个初始化方法,不过仍然要在其中选定一个作为全能初始化方法,令其他初始化方法都来调用他。
有时我们不想重写父类的全能初始化方法,因为有时可能是调用者自己犯了错误,这样我们应该在重写的弗雷初始化方法中抛出异常:

- (instancetype)initWithWidth:(float)width height:(float)height {
    
    @throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"不能用这种方式初始化" userInfo:nil];
}

当然,有时也会有多个“全能初始化方法”,比如NSCoding。当初始化时有多种截然不同的模式时,就会出现多个全能初始化方法,比如使用纯代码和Xib创建UI,就会用到两种不同的方法。

17. 实现description方法

18. 尽量使用不可变对象

19. 使用清晰而协调的命名方式

20. 为私有方法名加前缀

21. 理解Objective-C错误模型

抛出异常的方式:

@throw [NSException exceptionWithName:NSInvalidArgumentException reason:@"参数错误" userInfo:nil];

在arc下,默认并不是“异常安全的”。如果抛出异常,那么本来在作用域结束时释放的对象可能不会自动释放了。可以打开编译器标志“-fobjc-arc-exceptions”来生成“异常安全”的代码,不过这样会引入一些额外的异常安全代码。苹果官方也建议我们只在一些无法恢复的严重错误中使用。
当问题不那么严重,OC语言的编程范式为:

  1. 令返回值返回nil/0
  2. 使用NSError表明其中有错误发生
NSError的用法更加灵活,我们可以再NSError对象里封装三条信息:

22. 理解NSCopying协议

想令自己的对象支持拷贝操作,就需要实现NSCopying协议

- (id)copyWithZone:(NSZone *)zone

此处的zone为“默认区”,default zone。每个程序只有一个区,就是默认区。
可变对象的copy还需实现一个协议NSMutableCopying:

- (id)mutableCopyWithZone:(NSZone *)zone
深拷贝与浅拷贝

深拷贝:拷贝对象自身时,将其底层数据异议并复制过去。
Foundation框架中所有的collection都是浅拷贝,只拷贝容器,不拷贝容器内的元素。


浅拷贝与深拷贝的对比图

因为没有专门定义深拷贝的协议,所以其具体执行方式由每个类来确定,你只需决定自己所写的类是否要提供深拷贝方法即可。另外,不要假定遵从了NSCopying协议的对象都会执行深拷贝。在绝大多数情况下,执行的都是浅拷贝。如果需要再某对象上执行深拷贝,那么除非该类的文档说它是用深拷贝来实现NSCopying协议的,否则要么寻找能够执行深拷贝的相关方法,要么自己编写方法来做。

其他章节:

Effective Objective-C 2.0 学习笔记 第二章
Effective Objective-C 2.0 学习笔记 第四章

上一篇 下一篇

猜你喜欢

热点阅读