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没有实现。