chapter 18-19
Copy Objects
复制对象 → Foundation中的方法:copy和mutableCopy
protocol:<NSCopying> , <NSMutableCopying>
→ 在自己写的class中使用
mutable复制不要求object是mutable;immutable不要求object是immutable
mutable复制与 immutable复制的对比:
- 对immutable对象复制,copy是指针复制(shadow copy),但mutableCopy就是对象复制(deep copy)。如果是对mutable对象复制,都是deep copy,但是copy返回的对象是immutable
- iOS开发之深拷贝与浅拷贝详解
copy的默认值是shadow —— just copying the reference from one element of the array to another
- 与shadow copy相对的是deep copy —— make distinct copies of each element of the array
shadow copy、deep copy 与直接赋值(assignment)的对比:
- shadow copy创建新的array对象,但array中的object(实质为引用)直接复制原始array中的object(object引用所指向的object空间不变,不开辟新内存空间)
- assignment则是直接复制对原始array对象的引用,并不创建新array对象
- deep copy既创建新array对象,也创建新的array中的object(开辟新内存空间,存放与原始object值相同的新object)
在property中使用copy:(copy,nonatomic)
(默认值不是copy)
- nonatomic / atomic → 不使用 / 使用 mutex lock 保护 访问property的accessor
- mutex lock ( mut ually ex clusive) 互斥锁 —— 在任一时刻,只能有一个线程访问该对象
- 默认值是atomic;atomic更安全,但降低程序运行速度,nonatomic提高效率
如果复制的是包含immutable对象的实例变量 → 没有必要把 immutable对象也复制一遍,直接复制其引用就足够了(之后的修改不会影响到immutable对象本身)
Archiving
对象归档:the process of saving one or more objects in a format so that they can later be restored → 即将对象写入文件中
两种方式:property list (属性列表,即.plist文件) 和 key-valued coding (KVC机制) —— KVC和KVO
- Key-value coding is a mechanism for accessing an object’s properties indirectly, using strings to identify properties, rather than through invocation of an accessor method or accessing them directly through instance variables.
XML Property List
- NSString, NSDictionary, NSArray, NSDate, NSData, or NSNumber类的对象可以使用writeToFile:atomically:方法将对象写入文件中
- atomically:参数取值YES/NO;YES——先写进一个临时备份文件,全部完成后再移入目标文件中,防止意外情况(system crash等)对plist文件可能造成的损害
将plist文件的内容读入程序中:
- 返回dictionary:dictionaryWithContentsOfFile: 方法
- 返回array:arrayWithContentsOfFile:方法
- 返回data:dataWithContentsOfFile:方法
- 返回string:stringWithContentsOfFile:方法
更灵活的保存方式——NSKeyedArchiver class——任何类型的objects
- 对应的读取方式——NSKeyedUnarchiver class
- 需要在class中定义encodeWithCoder:方法(如何归档,即encode)and initWithCoder:方法(如何解档,即decode),遵守
<NSCoding>
协议
Using NSData to Create Custom Archives —— 将多种objects收集起来保存到一个文件
- 使用initForWritingWithMutableData:方法从NSData对象创建NSKeyedArchiver对象
- 归档的objects对应所属的class都要实现各自的encoder和decoder方法
- 使用finishEncoding方法结束归档
使用归档进行deep copy
- You don’t need to use a file for this process; the archiving and unarchiving process can all take place in memory. ( buffer )
- 不用遵守NSCopying协议