《编写高质量iOS与OS X代码的52个有效方法》14-21

2018-07-03  本文已影响12人  小如99

第14条:理解“类对象”的用意

  1. 方法签名:概念需要弄清楚

  2. Class.png

    super_class指针确立了继承关系,而isa指针描述了实例所属的类。

  3. 描述OC对象所使用的数据结构定义:typedef struct objc_object {Class is;} *id
    Class对象的定义:

    Class对象结构.png
  4. 对象比较.png

三个分支都走进去了,由此可见类对象是“单例”(singleton),在应用程序范围内,每个类的Class仅有一个实例。

要点:

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

1、Objective-C没有其他语言那种内置的命名空间(namespace)机制,所以就很容易出现重名。
2、Apple 宣称其保留使用所有“两字母前缀”的权利,所以你自己选用的前缀最好是三个字母的。
3、在类的实现文件中所用的纯C函数及全局变量,这个问题必须注意。在编译好的目标文件中(.o),这些名称是要算作“顶级符号”的,顶级符号很容易导致重名,需要加前缀。

要点:

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

1、什么是全能初始化方法? 全能初始化方法就是指的在一个类中,可能有很多初始化方法,例如NSDate的初始化方法:

- (id)init;
- (id)initWithString:(NSString *)string;
- (id)initWithTimeIntervalSinceNow:(NSTimeInterval)seconds;
- (id)initWithTimeInterval:(NSTimeInterval)seconds
             sinceDate:(NSDate *)refDate;
- (id)initWithTimeinterValSinceReferenceDate:(NSTimeInterval)seconds;
- (id)initWithTimeIntervalSince1970:(NSTimeInterval)seconds;

在这些初始化方法里面- (id)initWithTimeinterValSinceReferenceDate:(NSTimeInterval)seconds;就是全能初始化方法,也就是说其他初始化函数都要调用它初始化。只有在全能初始化方法中才能存储内部数据。这样的话,当底层数据存储机制改变时,只需修改此方法的代码就好了,无需改动其他初始化方法。

要点:

第17条:实现 description 方法

对于已经熟悉 iOS 开发的程序员来说,这是debug必备的技能。只需要在自定义的类中覆写- (NSString *)description函数即可,这个函数在事在你调用NSLog的时候输出的。与此相似的还有一个函数- (NSString *)debugDescription,这个函数是在调试器中使用命令的方式输出的,其命令格式po +输出对象,例如po person。需要注意的是,要在调试器中使用命令的方式输出需要打断点,使程序停在断点处,然后在调试器中使用命令。

要点:

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

  1. 只读属性也可以通过“键值变化”(Key-Value Coding,KVC)技术设置这些属性值。
  2. 什么是不可变对象?
    在使用属性时,将其声明为“只读”(read-only)。默认情况下,属性是 “即可读又可写的”(read-write),这样设计出来的类是可变的。
  3. 为什么要使用不可变对象?
    把可变对象(mutable object)放入collection(NSSet,NSArray,NSDictionary以及其子类)之后又修改其内容,那么很容易就会破坏set(集合)的内部数据结构,使其失去固有的语义。
  4. 怎么使用?
    若某属性仅可于对象内部修改,则在“class-continuation分类”中将其由readonly属性扩展为readwrite。不要把可变的collection对象作为属性公开,而应提供相关方法(增删改),以此修改对象中的可变collection。

要点:

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

  1. 方法命名
  1. 类与协议的命名,应该为类与协议的名称加上前缀,以避免命名空间冲突(参加第15条)

要点:

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

苹果只出现在实现文件(.m文件)中的函数可以看成是私有方法,私有方法建议以以下格式命名:

- (void)p_privateMethod()

要点:

第21条:理解Objective-C错误类型

  1. 在Objective-C里面我们可以使用NSError来描述错误,NSError对象封装了三条信息:
  1. NSError的常见用法
  1. 异常@throw [NSException exceptionWithName:@“ExceptionName”reason:@“There was an error”userInfo:nil];
    要点:
上一篇 下一篇

猜你喜欢

热点阅读