首页 > 其他 > 详细

黑马程序员----copy

时间:2015-03-27 01:11:53      阅读:331      评论:0      收藏:0      [点我收藏+]

1.copy(不可变副本)/mutableCopy(可变副本):

  • copy语法的目的:改变副本的时候,不会影响到源对象;

  • 一个对象可以使用copy/mutableCopy方法创建副本

  • copy需要先实现NSCopying协议,创建的是不可变副本

  • mutableCopy需要先实现NSMutableCopying协议,创建的时不可变副本

  • 深拷贝:内容(对象)的拷贝,源对象和副本指向的是不同的对象。源对象的引用计数器不变新对象的引用计数器设置为1

  • 浅拷贝:指针的拷贝,源对象和副本指向的时同一个对象。对象的引用计数器+1;相当于做了一次retain操作;

  • 只有不可变对象创建不可变副本(copy)才是前拷贝,其他的都是深拷贝;

  • NSString/NSMutableStringNSDictionary/NSMutableDictionaryNSArray/NSMutableArray等都已经实现了NSCopying协议NSMutableCopying协议,所以在使用copy或者mutableCopy创建副本是不用再实现NSCopying协议或者NSMutableCopying协议

2.浅拷贝(指针拷贝):

  • 浅拷贝:指针拷贝,不会产生新对象。源对象的计数器+1,相当于做了一次retain操作;

  • 只有一种情况是浅拷贝,不可变对象调用对象方法时;

  • 技术分享
  • 浅拷贝为指针的拷贝:

技术分享

3.深拷贝(内容拷贝):

  • 深拷贝:内容(对象)拷贝,会产生新对象。新对象的计数器置1,源对象的计数器不变;

  • 深拷贝一:NSString NSMutableCopy

  • 技术分享

  • 深拷贝二:NSMutableString  copy

          技术分享

  • 深拷贝三:NSMutableString  NSMutableCopy

           技术分享

  • 技术分享

3.自定义类以及子类的拷贝:

  • 自定义的类如果想使用copy或者mutableCopy必须要先实现NSCopying协议或者NSMutableCopying协议!不然会报错“[Student copyWithZone:]: unrecognized selector sent to instance 0x1030051a0

  • NSCopying协议或者NSMutableCopying协议中都各有一个方法:所以我们应该重新实现其方法!

             技术分享

  • - (id)copyWithZone:(NSZone *)zone方法的重写:

  • 技术分享
  • 由于子类中还有其他的属性(age),所以还要将age属性拷贝给副本,所以还要在子类中重写- (id)copyWithZone:(NSZone *)zone方法

  • 技术分享

 

  • 使用静态方法快速创建对象时的注意点:

  • 技术分享
 
 

黑马程序员----copy

原文:http://www.cnblogs.com/unique-ios/p/4370524.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!