如何实现数组的深拷贝

概念

  • iOS中有深拷贝和浅拷贝的概念,其中,浅拷贝并不拷贝对象本身,只是把指向对象的指针进行拷贝,该对象的引用系数加1。深拷贝拷贝的是对象本身,它把对象指针指向的内存空间取出来拷贝一份,然后把新对象的指针指向这块内存空间。
  • 在iOS中并不是所有对象都支持copy和mutableCopy,遵循NSCopying协议的对象可以发送copy消息,遵循NSMutableCopying协议的对象可以发送mutableCopy消息。如果一个对象没有遵循这两个协议而发送了copy消息和mutableCopy消息就会发生异常。
  • 要遵循NSCopying协议,必须实现copyWithZone方法,如果要遵循NSMutableCopy协议,那么必须实现NSMutableCopying方法

可变对象和不可变对象分别调用copy方法和mutableCopy方法的区别

  • 一个系统不可变对象,如NSString、NSArray、NSDictionary等,在调用copy方法的时候只是增加了对原对象指针的调用,而调用mutableCopy方法则是重新分配了一块内存空间,然后将新对象的指针指向新内存。
  • 一个系统非容器可变对象,如NSMutableString,在调用mutableCopy方法的时候,也是分配一个新的内存空间并将新对象的指针指向新内存
  • 一个系统容器可变对象,如NSMutableArray、NSMutableDictionary,在调用mutableCopy方法的时候,会产生一个新的mutable对象,但是该容器内包含的元素对象指针,依然复用之前的元素对象指针。如果要彻底产生一个新的mutable对象,则需要对容易内的元素分别进行一个mutableCopy才能做到。

你可能感兴趣的:(如何实现数组的深拷贝)