欢迎使用CSDN-markdown编辑器

OC中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:方法。

@protocol NSCopying
  • (id)copyWithZone:(NSZone *)zone;
    @end
    2、mutableCopy : 需要遵守NSMutableCopying协议,实现mutableCopyWithZone:方法
    @protocol NSMutableCopying

    • (id)mutableCopyWithZone:(NSZone *)zone;
      @end
      深复制和浅复制的区别:
      深复制(深拷贝、内容拷贝、deep copy):
      特点:1、源对象和副本对象是不同的两个对象;
      2、源对象引用计数器不变,副本对象计数器为1(因为是新产生的)。
      本质:产生了新对象。
      浅复制(浅拷贝、指针拷贝、shallow copy):
      特点:1、源对象和副本对象是同一对象;
      2、源对象(副本对象)引用计数器+1,相当于做一次retain操作。
      本质:没有产生新对象。
      常见的复制如下图:

      只有源对象和副本对象都不可变时,才是浅复制,其他都是深复制。
      关于区分深复制与浅复制的一些详细代码如下:
      /**
      NSMutableString调用mutableCopy : 深复制
      */
      void mutableStringMutableCopy()
      {
      NSMutableString *srcStr = [NSMutableString stringWithFormat:@”age is %d”, 10];
      NSMutableString *copyStr = [srcStr mutableCopy];

    [copyStr appendString:@”abc”];

    NSLog(@”srcStr=%@, copyStr=%@”, srcStr, copyStr);
    }

/**
NSMutableString调用copy : 深复制
*/
void mutableStringCopy()
{
NSMutableString *srcStr = [NSMutableString stringWithFormat:@”age is %d”, 10];

NSString *copyStr = [srcStr copy];


[srcStr appendString:@"abc"];

NSLog(@"srcStr=%p, copyStr=%p", srcStr, copyStr);

}

/**
NSString调用mutableCopy : 深复制
*/
void stringMutableCopy()
{
NSString *srcStr = [NSString stringWithFormat:@”age is %d”, 10];

NSMutableString *copyStr =  [srcStr mutableCopy];
[copyStr appendString:@"abc"];

NSLog(@"srcStr=%@, copyStr=%@", srcStr, copyStr);

}

/**
NSString调用copy : 浅复制
*/
void stringCopy()
{
// copy : 产生的肯定是不可变副本

//  如果是不可变对象调用copy方法产出不可变副本,那么不会产生新的对象
NSString *srcStr = [NSString stringWithFormat:@"age is %d", 10];
NSString *copyStr = [srcStr copy];

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对象)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值