1)因為父類指針可以指向子類對象,使用copy的目的是為了讓本對象的屬性不受外界影響,使用copy無論給我傳入是一個可變對象還是不可對象,我本身持有的就是一個不可變的副本.
2)如果我們使用是strong,那么這個屬性就有可能指向一個可變對象,如果這個可變對象在外部被修改了,那么會影響該屬性.
copy此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似。然而設(shè)置方法并不保留新值赊豌,而是將其“拷貝” (copy)难审。 當(dāng)屬性類型為NSString時,經(jīng)常用此特質(zhì)來保護(hù)其封裝性亿絮,因為傳遞給設(shè)置方法的新值有可能指向一個NSMutableString類的實例。這個類是NSString的子類,表示一種可修改其值的字符串派昧,此時若是不拷貝字符串黔姜,那么設(shè)置完屬性之后,字符串的值就可能會在對象不知情的情況下遭人更改蒂萎。所以秆吵,這時就要拷貝一份“不可變” (immutable)的字符串,確保對象中的字符串值不會無意間變動五慈。只要實現(xiàn)屬性所用的對象是“可變的” (mutable)纳寂,就應(yīng)該在設(shè)置新屬性值時拷貝一份。
為了理解這種做法泻拦,首先要知道毙芜,對非集合類對象的copy操作:
在非集合類對象中:對immutable對象進(jìn)行copy操作,是指針復(fù)制争拐,mutableCopy操作時內(nèi)容復(fù)制腋粥;對mutable對象進(jìn)行copy和mutableCopy都是內(nèi)容復(fù)制。用代碼簡單表示如下:
[immutableObject copy] // 淺復(fù)制
[immutableObject mutableCopy] //深復(fù)制
[mutableObject copy] //深復(fù)制
[mutableObject mutableCopy] //深復(fù)制
比如以下代碼:
NSMutableString?*string?=?[NSMutableString?stringWithString:@"origin"];//copy
NSString?*stringCopy?=?[string?copy];
查看內(nèi)存架曹,會發(fā)現(xiàn) string隘冲、stringCopy 內(nèi)存地址都不一樣,說明此時都是做內(nèi)容拷貝绑雄、深拷貝展辞。即使你進(jìn)行如下操作:
[string?appendString:@"origion!"]
stringCopy的值也不會因此改變,但是如果不使用copy万牺,stringCopy的值就會被改變罗珍。 集合類對象以此類推。 所以杏愤,
用@property聲明 NSString靡砌、NSArray、NSDictionary 經(jīng)常使用copy關(guān)鍵字珊楼,是因為他們有對應(yīng)的可變類型:NSMutableString通殃、NSMutableArray、NSMutableDictionary厕宗,他們之間可能進(jìn)行賦值操作画舌,為確保對象中的字符串值不會無意間變動,應(yīng)該在設(shè)置新屬性值時拷貝一份已慢。