Objective-C 序列化与对象通信技术详解
1. 编码时的类替换
在某些情况下,类可能不想对自身进行归档。这可能是因为它是类簇的私有子类,或者为了与早期设计实现向前兼容,希望将自身归档为另一个类。类在编码时可选择“伪装”成另一个类,或提供一个完全不同的对象来替代自身进行编码,有三种实现编码时替换的方法:
- 重写 -classForCoder 方法 :编码时会向对象发送此消息,归档中对象的类由返回值决定。基类实现返回 [self class]
,会按对象实际类记录。若返回不同类,解码时将创建该类的对象。需注意, -encodeWithCoder:
方法中编码的数据必须与 -classForCoder:
返回的类兼容。此方法影响所有归档类型,若想将类替换限制在特定归档类型,可重写 -classForArchiver
、 -classForKeyedArchiver
或 -classForPortCoder
,若未重写,这些方法返回 -classForCoder
的值。
- 重写 -replacementObjectForCoder 方法 :该方法通常返回 self
(即编码原始对象),若返回不同对象,则会编码该代理对象。 -replacementObjectForCoder:
会对所有归档编码执行替换,也可重写 -replacementObj