Copy 和 MutableCopy

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

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

    2、mutableCopy:创建的可变副本(如NSMutableStringNSMutableArrayNSMutableDictionary)。

    使用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操作。

      本质:没有产生新对象。

      常见的复制如下图:    

    

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
  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对象)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值