Programming in Objective-C 学习笔记09——对象复制与归档

来源:互联网 发布:淘宝男装牛仔衣服 编辑:程序博客网 时间:2024/06/03 17:43

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协议
0 0
原创粉丝点击