美文网首页
OC中copy的使用

OC中copy的使用

作者: 请叫我小白同学 | 来源:发表于2017-08-22 21:56 被阅读102次

    转载自https://my.oschina.net/aofe/blog/266677

    摘要: 在Objective-C中,一个对象可以调用copy或mutableCopy方法来创建一个副本对象,本文着重讲解如何正确使用copy的功能.


    首先,什么是copy?

    Copy的字面意思是“复制”、“拷贝”,是一个产生副本的过程。

    常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件。

    特点:1、修改源文件的内容,不会影响副本文件;

    2、修改副本文件的内容,不会影响源文件。

    OC中copy的作用是:利用一个源对象产生一个副本对象

    特点:1、修改源对象的属性和行为,不会影响副本对象;

    2、修改副本对象的属性和行为,不会影响源对象。

    如何使用copy功能?

    一个对象可以调用copy或mutableCopy方法来创建一个副本对象。

    1、copy:创建的时不可变副本(如NSString、NSArray、NSDictionary)。

    2、mutableCopy:创建的可变副本(如NSMutableString、NSMutableArray、NSMutableDictionary)。

    使用copy功能的前提:

    1、copy:需要遵守NSCopying协议,实现copyWithZone:方法。

    @protocolNSCopying

    - (id)copyWithZone:(NSZone*)zone;

    @end

    2、mutableCopy : 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法

    @protocolNSMutableCopying

    - (id)mutableCopyWithZone:(NSZone*)zone;

    @end

    深复制和浅复制的区别:

    深复制(深拷贝、内容拷贝、deep copy):

    特点:1、源对象和副本对象是不同的两个对象;

    2、源对象引用计数器不变,副本对象计数器为1(因为是新产生的)。

    本质:产生了新对象。

    浅复制(浅拷贝、指针拷贝、shallow copy):

    特点:1、源对象和副本对象是同一对象;

    2、源对象(副本对象)引用计数器+1,相当于做一次retain操作。

    本质:没有产生新对象。

    常见的复制如下图:

    只有源对象和副本对象都不可变时,才是浅复制,其他都是深复制。

    关于区分深复制与浅复制的一些详细代码如下:


    /**

    NSMutableString调用mutableCopy : 深复制

    */voidmutableStringMutableCopy(){NSMutableString*srcStr = [NSMutableStringstringWithFormat:@"age is %d",10];NSMutableString*copyStr = [srcStr mutableCopy];        [copyStr appendString:@"abc"];NSLog(@"srcStr=%@, copyStr=%@", srcStr, copyStr);}/**

    NSMutableString调用copy : 深复制

    */voidmutableStringCopy(){NSMutableString*srcStr = [NSMutableStringstringWithFormat:@"age is %d",10];NSString*copyStr = [srcStrcopy];            [srcStr appendString:@"abc"];NSLog(@"srcStr=%p, copyStr=%p", srcStr, copyStr);}/**

    NSString调用mutableCopy : 深复制

    */voidstringMutableCopy(){NSString*srcStr = [NSStringstringWithFormat:@"age is %d",10];NSMutableString*copyStr =  [srcStr mutableCopy];    [copyStr appendString:@"abc"];NSLog(@"srcStr=%@, copyStr=%@", srcStr, copyStr);}/**

    NSString调用copy : 浅复制

    */voidstringCopy(){//  copy : 产生的肯定是不可变副本//  如果是不可变对象调用copy方法产出不可变副本,那么不会产生新的对象NSString*srcStr = [NSStringstringWithFormat:@"age is %d",10];NSString*copyStr = [srcStrcopy];NSLog(@"%p %p", srcStr, copyStr);}


    @property内存管理策略的选择

    1.非ARC

    1> copy :只用于NSString\block;

    2> retain :除NSString\block以外的OC对象;

    3> assign :基本数据类型、枚举、结构体(非OC对象),当2个对象相互引用,一端用retain,一端                     用assign。

    2.ARC

    1> copy :只用于NSString\block;

    2> strong :除NSString\block以外的OC对象;

    3> weak :当2个对象相互引用,一端用strong,一端用weak;

    4> assgin :基本数据类型、枚举、结构体(非OC对象)


    相关文章

      网友评论

          本文标题:OC中copy的使用

          本文链接:https://www.haomeiwen.com/subject/wwlrdxtx.html