美文网首页
Effective Objective-C 2.0 学习笔记 第

Effective Objective-C 2.0 学习笔记 第

作者: TAsama | 来源:发表于2018-12-21 15:22 被阅读6次

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

接口与API设计

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

  • Apple 宣称其保留使用所有“两字母前缀”,所以我们自定义的类名前缀应该唱为三字母
  • 分类和分类中的方法前应该加上前缀。
  • 使用C函数时应该加上前缀。

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

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

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

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

17. 实现description方法

  • 实现description方法,返回有意义的字符串,用意描述该实例。
  • 若想在调试时打印出更详尽的对象描述信息,则应实现debugDescrption方法

18. 尽量使用不可变对象

  • 尽量创建不可变对象。
  • 若某属性仅可于对象内部修改,则在扩展中将其readonly属性扩展为readwrite属性。
  • 不要把可变的collection作为属性公开,而应提供相关的方法,以此修改对象中的可变collection。

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

  • 起名时应遵从标准的OC命名规范,这样创建出来的接口更容易为开发者所理解。
  • 方法名谣言简意赅,从左至右读起来要像个日常用语中的句子。
  • 方法名里不要使用缩略后的类型名称。
  • 给方法起名时的第一要务就是确保其风格与你自己的代码或索要集成的框架相符。

20. 为私有方法名加前缀

  • 给私有方法的名称加上前缀,这样可以很容易的将其同公共方法区分开来。
  • 不要单用一个下划线做私有方法的前缀,这是预留给苹果公司的。

21. 理解Objective-C错误模型

抛出异常的方式:

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

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

  1. 令返回值返回nil/0
  2. 使用NSError表明其中有错误发生
NSError的用法更加灵活,我们可以再NSError对象里封装三条信息:
  • Error domain (错误范围,其类型为字符串)
  • Error code (错误码,其类型为整数)
  • User info (用户信息,其类型为字典)

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 学习笔记 第四章

相关文章

网友评论

      本文标题:Effective Objective-C 2.0 学习笔记 第

      本文链接:https://www.haomeiwen.com/subject/rzipkqtx.html