strong此特質(zhì)標(biāo)明該屬性定義了一種擁有關(guān)系。為這種屬性設(shè)定新值時施无,設(shè)置方法會先保留新值再釋放舊值销部,然后再講新值設(shè)置上去硫椰。
copy 此特質(zhì)所表達(dá)的所屬關(guān)系與strong類似。然而設(shè)置方法并不保留新值而是將其拷貝骆莹,當(dāng)屬性類型為NSString*時颗搂,經(jīng)常用此特性來保護(hù)其封裝性,因為傳遞給設(shè)置方法的新值有可能指向一個NSMutableString類的實例這個類是NSString的子類幕垦,表示一種可以修改其值得字符串丢氢,此時若是不拷貝字符串,那么設(shè)置完屬性之后先改,字符串的值就可能會在對象不知情的情況下遭人更改疚察。所以這時就要拷貝一份不可變的字符串,確保對象中的字符串值不會無意間變動盏道。只要實現(xiàn)屬性所用的對象是可變的稍浆,就應(yīng)該在設(shè)執(zhí)行屬性是拷貝一份。
現(xiàn)有A猜嘱、B兩個類衅枫,A類設(shè)置一可變字符串a(chǎn) , B類聲明兩個strong copy兩個不同變量b1朗伶、b2弦撩;
B * b =[[B alloc]init];
NSMutableString * a=[@"first" mutableCopy];
B.b1=a;
B.b2=a;
分析下面兩種操作對B中b1、b2影響
1??[a appendString:@"+"]; ? ? / ? ?2??a=[@"second" mutableCopy];
NSLog(@"%@",B.b1);
NSLog(@"%@",B.b2);
第一種打印結(jié)果分別為first first+
第二種打印結(jié)果分別為first first
針對第一種分析:strong指向的是相同對象地址论皆,僅僅是指針引用益楼,增加了引用計數(shù),這樣源頭改變的時候点晴,它也會跟著改變; 而copy聲明的變量感凤,指向的是不同對象地址、它不會跟著源頭改變粒督,實際上是深拷貝陪竿。
而第二種,重新賦值相當(dāng)于對于變量a又重新開辟了一段地址屠橄,而b1中記錄的依舊是初始值a的地址族跛,所以其值不發(fā)生改變。