NSString类型变量用strong修饰有什么不一样

NSString类型变量用strong修饰有什么不一样

主要在于赋值给不可变对象时,copy修饰的,他会报错, strong修饰的,就会变成可变类型, 但是不可变对象不想让他成为可变类型

后面不用看了, 写跑题了

写在前面

test = str2
以此为例,文中出现的赋值对象指str2, 被赋值对象指test。

strong和copy的区别

区别在与strong属性关键字实现原理是赋值的对象的引用计数加一

_test = str2;

如果_test是strong修饰,那么这句实现的就是str2指向的对象的引用计数加一。
而如果是copy

self.test2 = str2;

这句话就等价于

_test2 = [str2 copy];

copy分为深浅复制,深复制是内容复制(新开辟一块内存地址,并复制原来的值), 浅复制是地址复制(不开辟新的地址,只是让_test2的指针指向str2指向的地址),这里不再细说。

对于不可变对象,strong和copy的区别

(只有不可变对象的不可变复制是浅复制,其余都是深复制)
strong对赋值对象没什么区别,都是把指针指向赋值对象所指的地址,所以区别在与copy。
copy对于不同的赋值对象有不同的实现方式(深浅复制),对于不可变对象都是浅复制,但是对于可变对象是深复制。所以当赋值对象是不可变对象时没什么区别,但如果是可变对象,copy方法是深复制,就与strong不同了。

测试

@property (nonatomic, strong)NSString *test1;
@property (nonatomic,copy)NSString *test2;

这是两个变量,test1是strong修饰的不可变字符串,test2是copy修饰的不可变字符串。
定义一个可变字符串

 NSMutableString *pyr = [[NSMutableString alloc] initWithString:@"123"];
  • strong修饰的做以下赋值

self.test1 = pyr

强应用使test1指向pyr指向的对象地址。

  • copy修饰的做以下赋值

self.test2 = pyr

copy修饰,可变对象的复制是深复制,所以重新开辟了地址,复制了pyr所指向的对象,然后赋值给新开辟的地址上。

tips

我刚开始对于copy修饰的写的是

_test2 = pyr;

按理说是不可变对象的复制是深复制,_test2的地址应该和pyr的地址不一样才是,但几次测试都是一样的,是因为属性关键字是对属性而言的,属性的定义就是生成了set和get方法并生成一个成员变量,而调用_test2就是调用这个成员变量,点语法是会走set和get方法,成员变量不会。(他们说ARC属性关键字的实现是把实现代码动态添加在set方法中),所以copy没有实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值