美文网首页
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