五.copy关键字分析
copy修饰的属性会对指向的对象进行拷贝操作,而strong是进行了强引用,相当于MRC环境下的retain操作,那么问题来了这个copy到底执行的是浅拷贝还是深拷贝呢?
1.当指向的对象是一个不可变的对象时,进行的是浅拷贝
下面以NSString的对象为例演示
分析:n与self.name指向的对象地址相同,且都是不可变的对象,所有仅仅做了浅拷贝操作
2.当指向的对象是一个可变的对象时,进行的是深拷贝
分析:发现n,nn,self.name3个指向的内存地址都不相同,而且self.name值与nn的初始值相同,nn值后面改变对self.name无影响,这就说明在self.name=nn的时候对nn对象进行了深拷贝,且深拷贝创建的是一个不可变的对象。
扩展:那么这个name属性我用strong关键字修饰行不行呢:
肯定是不行的,当self.name指向的是一个不可变的字符串用copy和strong其实都没有问题,虽然self.name声明的是NSString类型,但是因为父类的指针可以指向子类对象,所以无法保证在什么时候self.name被赋值一个不可变字符串,那么这个不可变字符串一旦更改self.name的值也会更改,这肯定不是我们想要的。
总结:
1.对NSString,NSArray,NSDictionary类型的属性都必须要有copy修饰。
2.block 也经常使用 copy 关键字