OC中self.xxx和_xxx访问的区别,深拷贝和浅拷贝的区别

iOS中self与_变量的区别
本文通过实例对比了在iOS开发中通过self访问属性与直接访问成员变量的区别,解释了深拷贝与浅拷贝的概念及其对字符串操作的影响。

    初学iOS时候,发现有的代码通过self.xxx访问,有时通过_xxx访问,一直搞不清楚有什么区别。其实,通过self.xxx是对属性进行访问,本质是调用属性的setter方法,引用计数器会+1;_xxx是直接对成员变量进行访问,是对指针的赋值,引用计数器没发生改变。下面,通过代码来看一下。

 

    定义属性:

@property (nonatomic, copy)NSString *strCopy1;

@property (nonatomic, copy)NSString *strCopy2;

 

    生成个可变字符串str,内容为“123”,分别通过self.strCopy1、_strCopy2进行赋值,通过打印,发现都能够成功赋值;

    然后对这个可变字符串str,进行拼接,内容为“123456”;

    再打印self.strCopy1和self.strCopy2,咱们这里原意应该是self.strCopy1和self.strCopy2的值不变,依然为“123”,但是,这里打印结果strCopy1正常为“123”,而strCopy2为“123456”。究竟是为什么?

- (void)viewDidLoad {

    [super viewDidLoad];  

 

 

    NSMutableString *str = [NSMutableString stringWithFormat:@"123"];

    self.strCopy1 = str;

    _strCopy2 = str;

    

    NSLog(@"strCopy1:%@ -------- strCopy2:%@",self.strCopy1,self.strCopy2 );

    //    打印出来: strCopy1:123 -------- strCopy2:123

    

    [str appendString:@"456"];

    

    NSLog(@"strCopy1:%@ -------- strCopy2:%@",self.strCopy1,self.strCopy2 );

    //    打印出来: strCopy1:123 -------- strCopy2:123456

}

 

    因为通过self.strCopy1赋值是调用了编译器默认生成的setter方法,调用了[_strCopy1 copy],copy为内容拷贝,就是深拷贝,_strCopy1已经指向了重新生成的另一块内存了,不是原来_str指向的那一块内存了,所以改变_str原来指向的那块内存里面的字符串内容,不影响_strCopy1指向的内容。

    而通过_strCopy2赋值,是对成员变量直接赋值,没有进行内容拷贝(深拷贝),只是进行了指针拷贝(浅拷贝),_strCopy2仍然指向_str原来指向的那块内存。所以改变_str原来指向的那块内存的字符串内容,会直接影响_strCopy2的内容。 

    其实,copy和retain的区别就是深拷贝和浅拷贝的原因。也是为什么修饰NSString的是copy,而不是retain。

 

 

    

转载于:https://www.cnblogs.com/ladyotao/p/5802586.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值