Copy

#import "ViewController.h"


@interface ViewController ()

@property (nonatomic, copy) NSString *str1;

  //copy 后的返回值是不可变字符串,所以 _str2,不能用copy修饰。

@property (nonatomic, copy) NSMutableString *str2;


//============================================


@property (nonatomic, copy) NSArray *arr1;

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

//    [self copyArray];

//    NSLog(@"=================");

    [self copyMutiArray2];

}


/*

 对一个不可变字符串进行拷贝,是浅拷贝,四个字符串地址一样。

 所以当把一个不可变字符串,赋值给另一个不可变字符串时,copy是没有意义的。

 */


- (void)copyString {

    NSString *str = @"aaaaaaaaaaaaaaa";

    self.str1 = str;

    NSString *str2 = str.copy;

    NSMutableString *str3 = str.copy;

//    [str4 appendString:@"111"]; //copy 后的返回值是不可变的,所以会崩。

    NSLog(@"\n str : %p,\n str1: %p,\n str2: %p,\n str3: %p",str,_str1,str2,str3);

    

}


/*

 对一个可变字符串进行拷贝,是深拷贝,四个字符串地址不一样。

 所以,NSStringcopy修饰的原因是:当把一个可变的字符串赋值给不可变的字符串时,使用copy是深拷贝了一个字符串,这样可变字符串改变时,不会影响这个不可变字符串。

 */

- (void)copyMutiString {

    NSMutableString *str = [NSMutableString stringWithString:@"bbbbbbbbbbbb"];

    self.str1 = str;

    NSString *str2 = str.copy;

    NSMutableString *str3 = str.copy;

    //地址不一样

    NSLog(@"\n str : %p,\n str1: %p,\n str2: %p,\n str3: %p",str,_str1,str2,str3);

    

    self.str2 = str;

    [self.str2 appendString:@"2222"];  //copy 后的返回值是不可变的,所以会崩

}


- (void)copyArray {

    NSArray *arr = @[@"11",@"22",@"33",@"44"];

    self.arr1 = arr;

    NSArray *arr2 = arr.copy;

    NSMutableArray *arr3 = arr.copy;

    //地址都一样

    NSLog(@"\n arr : %p,\n arr1: %p,\n arr2: %p,\n arr3: %p",arr,_arr1,arr2,arr3);

    

    //地址都一样

    NSLog(@"\n arr[2] : %p,\n arr1[2]: %p,\n arr2[2]: %p,\n arr3[2]: %p",arr[2],_arr1[2],arr2[2],arr3[2]);

    

}


/*

 对一个可变数组进行拷贝,是深拷贝,四个数组地址不一样,但是数组中每一个元素的地址没有变化。

 */


- (void)copyMutiArray {

    NSMutableArray *arr = [NSMutableArray arrayWithArray:@[@"11",@"22",@"33",@"44"]];

    self.arr1 = arr;

    NSArray *arr2 = arr.copy;

    NSMutableArray *arr3 = arr.copy;

    //地址不一样

    NSLog(@"\n arr : %p,\n arr1: %p,\n arr2: %p,\n arr3: %p",arr,_arr1,arr2,arr3);

    

    //地址都一样

    NSLog(@"\n arr[2] : %p,\n arr1[2]: %p,\n arr2[2]: %p,\n arr3[2]: %p",arr[2],_arr1[2],arr2[2],arr3[2]);

}


- (void)copyMutiArray2 {

    NSMutableString *s1 = [NSMutableString stringWithString:@"11"];

    NSMutableString *s2 = [NSMutableString stringWithString:@"22"];

    NSMutableString *s3 = [NSMutableString stringWithString:@"33"];

    NSMutableString *s4 = [NSMutableString stringWithString:@"44"];

    

    NSMutableArray *arr = [NSMutableArray arrayWithArray:@[s1,s2,s3,s4]];

    self.arr1 = arr;

    NSArray *arr2 = arr.copy;

    NSMutableArray *arr3 = arr.copy;

    //地址不一样

    NSLog(@"\n arr : %p,\n arr1: %p,\n arr2: %p,\n arr3: %p",arr,_arr1,arr2,arr3);

    

    //地址都一样

    NSLog(@"\n arr[2] : %p,\n arr1[2]: %p,\n arr2[2]: %p,\n arr3[2]: %p",arr[2],_arr1[2],arr2[2],arr3[2]);

    

    [arr[0] appendString:@"aa"];

    //地址都一样,所以值都变了

    NSLog(@"%@ %@, %@, %@",arr[0],_arr1[0],arr2[0],arr3[0]);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值