--对象消息运行期
第一条:理解“对象等同性”这一概念
按照===操作符比较的结果是,判断两个指针本身,而不是指针所知的对象
NSObject对象存在两个判断对象相等的方法
- (BooL) isEqual:(id)object;
- (NSUInteger)hash;
如果是字符串的话,我们尽量使用isEqualToString方法这个事字符串特有,比isEqual效率高
NSObject类对这两个方法的默认实现是:当且仅当其“指针值”完全相等时,这两个对象才相等。若想要在自定义的对象中正确覆写这些方法,就必须先理解其约定。如果“isEqual:”方法判断两个对象相等,那么其hash方法也必须返回同一个值。但是,如果两个对象的hash方法返回同一个值,那么“isEqual:”方法未必就会认为两者相等。
还有数组和字典也有相应的方法“isEqualToArray”和“isEqualToDictionary”
等同性判断的深度执行
对于数组而言系统都是先判断数组对象是否相等,然后逐个判断数组内的元素是否相等
这对我们自定义对象而言,如果我们的对象存在主键的话,我们可以只判断主键是否相等即可判断两个相同类型的对象是否相等
容器中可变类的等同性
把某对象放入容器之后改变其内容将会造成不可测的后果,并不是说绝对不能这么做,但是说如果真要这么做的话,那就得注意其隐患,并用相应的代码处理可能发生的问题。
打个比方,set是不允许两个相等的对象存在的,如果你试试用一个数组加入到set中,然后在加入另外一个数组,逐个数组只有前一个数组的一半元素,好了这下没问题,但是如果你再把剩下的元素添加到后面的这个数组中,结果居然可以使一个set同时存在两个相同的数组,这本身就是错的
第二条:以“类族模式”隐藏实现细节