美文网首页
Effective Objective-C 2.0笔记(三)

Effective Objective-C 2.0笔记(三)

作者: _小沫 | 来源:发表于2018-05-30 22:16 被阅读18次

Effective Objective-C 2.0笔记(一)
Effective Objective-C 2.0笔记(二)
Effective Objective-C 2.0笔记(三)

第三章 接口与API设计

第15条:用前缀避免命名冲突

  • OC没有命名空间,为了避免潜在的命名冲突,可以使用加前缀的方式
  • 选择公司,应用程序或有关联的名称作为类名的前缀,并在所有代码中使用这一前缀

第16条:提供“全能初始化方法”

  • 全能初始化方法:为对象提供必要信息以便其能完成工作的初始化方法,类似UITableViewCell初始化方法:
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier

这里必要信息是:style,reuseIdentifier样式及重用标识

  • 有多个初始化方法时,可以在其中选定一个作为全能初始化方法,令其他初始化方法都调用他。这样,这有全能初始化方法存储内部数据,需要改变内部结构时,只需要改全能初始化方法而不用改动其他初始化方法
  • 如果超类的初始化方法不适用于子类,那么应该覆写这个超类的方法,并在其中抛出异常

第17条:实现description方法

通过NSLog打印并查看对象信息时,对象会收到description消息,返回对象相关的信息。但默认的description方法返回的信息,有时并不是我们想要的,通过覆写description可以实现输出我们在定义的信息。类似的,还有debugDescription方法,它和description区别:debugDescription方法是开发者在调试器以控制台命令打印对象时调用的(LLDB "po"命令)。当我们通过LLDB "po"命令打印对象信息时,就可以覆写debugDescription返回我们需要的信息。

第18条:尽量使用不可变对象

  • 使用属性时,默认情况下属性是“可读可写”的,这样设计出来的类都是“可变的”。
  • 为了防止对象被更改,应该尽量把对外公布的属性设为只读,而只在必要的时候才对外公布。
  • 若某属性仅可于对象内部修改,可以在分类中将readonly属性扩展为readwrite属性。
  • 不要把可变的集合(collection)作为属性公开,而应提供方法,通过方法修改对象的可变collection。

第19条:使用清晰而协调的命名方式

  • 方法命名:方法名使用“驼峰大小写命名法”;使用“in”,“for”,“with”等介词连接,使得代码读起来和句子一样;方法名要明确每个参数等含义,把表示参数类型的名词放在参数前面;方法有返回值时,方法名的首个词最好是返回值的类型;布尔属性应该根据其功能,选用类似has, is当前缀;不要使用类似str简称,应该使用全称;方法名也不能长得太过分,应尽量在用意表达清楚的基础上做到言简意赅;
  • 类和协议的命名:类和协议的名称要加上前缀,避免命名冲突;命名应该把词汇组织好,从左至右读起来通顺;定义委托协议时,把委托接口的类名放在前面,后面加Delegate一词。

第20条:为私有方法名加前缀

为私有方法名加前缀,很容易区分公共方法和私有方法,有助于调试。使用何种前缀,由个人喜好决定,一般用p_作为前缀,尽量不要单独使用_作为前缀只是预留给苹果爸爸的。

第21条:理解错误模型

  1. 用异常机制处理错误
  • 通过@throw抛出异常(NSException)
  • 通过@try @catch捕获并处理异常

但这种机制,如果抛出异常,那么本应在作用域末尾释放的对象不会自动释放,也就是说默认情况下不是“异常安全的”;所以,异常只应该应用于极其严重的错误,异常抛出后无须考虑恢复问题,而且应用程序此时应该退出。

  1. NSError
  • 处理不是很严重的错误,表明有错误发生,程序不用退出。
  • 用法灵活,对象里封装了3条消息:Error domain错误范围;Error code错误码;Userinfo用户信息;
  • NSError一个常见用法是通过委托协议传递此错误。
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
  • 另一个用法是经由方法的输出参数返回调用者,传递的参数是个指针,这个指针又指向另一个指针,另一个指针指向NSError对象。
- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(nullable NSDictionary<NSFileAttributeKey, id> *)attributes error:(NSError **)error

第22条:理解NSCopying协议

  • 若想令自己所写的对象具有拷贝功能(copy),需要实现NSCoping协议。通过实现- (id)copyWithZone:(NSZone *)zone方法返回新的对象
  • 如果自定义的类分为可变和不可变版本,要同时实现NSCopying和NSMutableCopying协议

相关文章

网友评论

      本文标题:Effective Objective-C 2.0笔记(三)

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