copy
復(fù)制
淺復(fù)制:指針的復(fù)制(地址的復(fù)制)
深復(fù)制:對象內(nèi)容的復(fù)制
Foundion的基本對象復(fù)制
基本對象都實現(xiàn)的NSCoping和NSMutableCoping協(xié)議
都可以實現(xiàn)淺復(fù)制和深復(fù)制
copy和mutableCopy
copy復(fù)制出來的對象都是不可變的
mutableCopy復(fù)制出來的對象都是可變的
可變對象的copy和mutableCopy
可變對象的mutableCopy復(fù)制出來一個可變的對象殴瘦,復(fù)制的含義是兩份對象更改內(nèi)容是互不影響的戏售,就是改變一個不影響另一個,兩個對象都是可變的挤忙,又互不影響,所以是深復(fù)制的不同對象
可變對象的copy出來的對象是不可變的孙咪,復(fù)制出來的對象的性質(zhì)已經(jīng)發(fā)生了變化饥臂,原對象的改變不會影響復(fù)制出來的對象(復(fù)制出來的是不可變的對象,不會改變)谢翎,所以是深復(fù)制
不可變對象的copy和mutableCopy
不可變對象copy出來的對象是不可變的,既然兩個對象都是不可變的沐旨,都不會發(fā)生改變森逮,所以兩者引用同一塊地址,所以是淺復(fù)制
不可變對象的utableCopy出來的對象是可變的磁携,復(fù)制出來的對象的性質(zhì)已經(jīng)發(fā)生了變化褒侧,復(fù)制出來的對象的改變不會影響原來的對象對象(原對象不可變的對象,不會改變)谊迄,所以是深復(fù)制
總結(jié):復(fù)制就是拷貝一份闷供,但是由于copy出來的是不可變的,所以如果原來的對象也是不可變的统诺,那么兩者都使用同一地址即可歪脏,不必再分配內(nèi)存創(chuàng)建一個新的對象
自定義對象的copy和mutableCopy
copy實現(xiàn)NSCopying協(xié)議的方法即可,在方法中創(chuàng)建一個新的對象粮呢,將當前對象的屬性值賦值給創(chuàng)建出來的對象即可
mutableCopy實現(xiàn)NSMutableCopying中的方法即可唾糯,但是用的比較少怠硼,一般使用copy即可
- (id)copyWithZone:(NSZone *)zone{
Person *person = [[Person allocWithZone:zone] init];
person.age = self.age;
return person;
}
- 屬性中從copy策略
- 使用strong同樣可以強引用外部傳來的對象,但是當外部對象在外部被改變時屬性的值也將會發(fā)生改變
- 如果使用copy策略移怯,會產(chǎn)生一個不可變的對象,外部的對象改變時屬性值也不會發(fā)生改變
- 由于copy策略產(chǎn)生的對象都是不可變的这难,即使使用可變的對象去接收本質(zhì)還是不可變的舟误,如果調(diào)用可變對象的方法會發(fā)生crash
/** name屬性值永遠是不可變,所以定義為NSMutableString是不合理的,調(diào)用NSMutableString的方法會crash*/
@property (nonatomic, copy) NSMutableString *name;