关于iOS中的深拷贝和浅拷贝

        记录我的第一篇技术文章。说说iOS中的深拷贝和浅拷贝吧。

        iOS中,简单的说,深拷贝会拷贝生成一个新的对象。浅拷贝只拷贝这个对象的指针。网上有个形象的比喻:浅拷贝是你的影子,深拷贝是你的克隆人。你死掉了或改变了,影子也会改变。但是你死掉了或者改变了,克隆人并不会死掉、改变。

        如不可变对象NSString,NSArray,NSDictionary等,使用copy就是浅拷贝(引用计数+1),使用mutableCopy就是深拷贝(引用计数不变)。而NSMultableString,NSMultableArray,NSMutableDictionary等,使用copy或mutableCopy都是深拷贝。

        经常会被问到,NSString,NSArray等写@property的时候为什么要写成copy而不用strong这个问题?

        分析如下:如果你有一个NSString的属性name,然后你有一个NSMultableString的属性mName赋给这个name,当你的name的@property使用的是strong修饰,那么你的NSString的name属性的指针将会指向这个NSMultableString的mName的地址。此时,如果有人不知情的情况下更改了mName,那么你的name也会相应的改变;但是如果@property使用的是copy呢?这时NSString的name属性的指针并不是指向mName的地址,而是指向了[mName copy]深拷贝后生成的新对象的地址。这时候即使有人不知情的情况下更改mName,也不会影响到name的值了。(NSArrary、NSDictionary同样类似)

        由上面的分析可知道,其实NSString、NSArrary、NSDictionary类型的@property属性使用strong也是可以的。如果我们明确知道我们要赋给name的类型不会是NSMultableString,NSMultableArray,NSMutableDictionary的可变类型的情况下,我们完全可以使用strong也不会有影响。

你可能感兴趣的:(关于iOS中的深拷贝和浅拷贝)