OC-copy、深拷贝和浅拷贝的理解

深拷贝和浅拷贝的区别:

  • 浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址
  • 深拷贝是真正的复制了一份,复制的对象指向了新的地址

  从上图可以看出,浅拷贝A指针改变了所指向的内容B指针也指向被修改后的内容。如果有些地方用到B指针,不希望在A指向的内容发生变化时也跟着变化,则需要用到深拷贝。可得出结论:

深拷贝 : 拷贝出来的对象与源对象地址不一致! 这意味着我修改拷贝对象的值对源对象的值没有任何影响.
浅拷贝 : 拷贝出来的对象与源对象地址一致! 这意味着我修改拷贝对象的值会直接影响到源对象.

 

copy和mutaleCopy的区别:

  • 拷贝的对象主要分以下四种
  1. 非容器不可变对象:NSString
  2. 非容器可变对象: NSMutableString
  3. 容器类不可变对象: NSArray、NSDictionary等
  4. 容器类可变对象: NSMutableArray、NSMutableDictionary等
  • copy和mutableCopy对不同对象拷贝的结果:

 

copy关键字的使用:

        在iOS开发中,一般使用copy修饰的属性有NSString、NSArray、NSDictionary。

  • 为什么上述属性需要使用copy修饰呢?

        原因是上述属性都有可变的子类,如 NSString->NSMutableString、NSArray->NSMutableArray、NSDictionary->NSMutableDictionary;根据面相对象的多态特性,NSString类型的变量可以指向NSMutableString类型的变量。声明对象的属性一般都是希望明确知道对象的值,但是如果对子类是可变类型的属性使用strong修饰的话,可能会在对象不知情的情况下修改对象属性的值。

     测试代码如下:

@interface Test : NSObject

@property (nonatomic,strong) NSString * testStr ;

+ (void)logCopyTest;

@end


--------------.m--------------
#import "Test.h"

@implementation Test

+ (void)logCopyTest {
    
    Test *testM = [[Test alloc] init];
    NSMutableString *test1 = [[NSMutableString alloc] initWithString:@"str"];
    testM.testStr = test1;
    NSLog(@"testStr = %p  value = %@", testM.testStr, testM.testStr);
    
    [test1 appendString:@"add"];
    NSLog(@"testStr = %p  value = %@", testM.testStr, testM.testStr);
    
    test1.string = @"333";
    NSLog(@"testStr = %p  value = %@", testM.testStr, testM.testStr);
    
}

-------------调用-------------
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [Test logCopyTest];
}

打印结果如下:

  可以看到用strong修改的testStr属性的值,随着test1值的改变而改变。

   如果把strong修改成copy后:

@interface Test : NSObject

@property (nonatomic,copy) NSString * testStr ;

+ (void)logCopyTest;

@end

打印的结果如下:

可以看出copy修改的属性值没有根据test1的值改变。

从上面的示例中,可以了解,属性的修饰符是使用copy还是strong,取决于修改的类型是否要根据引用的值的改变而改变。

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值