1 . 可讀性: readonly慰于、readwrite
@property(readwrite,....) valueType value;
這個(gè)屬性是變量的默認(rèn)屬性钮科,就是如果你 (readwrite and readonly 都沒有使用,那么你的變量就是 readwrite屬性 ) 东囚,通過加入 readwrite 屬性你的變量就會有 get 和 set 方法跺嗽。
property(readonly,...) valueType value;
這個(gè)屬性變量就是表明變量只有可讀方法战授,也就是說页藻,你只能使用它的 get 方法。
2 . assign , setter 方法直接賦值植兰,不進(jìn)行任何 retain 操作份帐,為了解決原類型與環(huán)循引用問題
3 . retain , setter 方法對參數(shù)進(jìn)行 release 舊值再 retain 新值,所有實(shí)現(xiàn)都是這個(gè)順序
4 . copy 楣导,setter 方法進(jìn)行 Copy 操作废境,與 retain 處理流程一樣,先舊值 release 筒繁,再 copy 出新的對象噩凹,retainCount 為 1 。這是為了減少對上下文的依賴而引入的機(jī)制毡咏。
5 .nonatomic ,非原子性訪問驮宴,不加同步,多線程并發(fā)訪問會提高性能呕缭。
注意堵泽,如果不加此屬性修己,則默認(rèn)是兩個(gè)訪問方法都為原子型事務(wù)訪問。鎖被加到所屬對象實(shí)例級 迎罗。 所以不加nonatomic 對與多線程是安全的 睬愤。
6 . retain vs. Copy
copy? :建立一個(gè)索引計(jì)數(shù)為 1 的對象,然后釋放舊對象
retain :釋放舊的對象纹安,將舊對象的值賦予輸入對象尤辱,再提高輸入對象的索引計(jì)數(shù)為 1
那上面的是什么該死的意思呢?
copy 其實(shí)是建立了一個(gè)相同的對象厢岂,而 retain 不是:
比如定義如下屬性:
[代碼]c#/cpp/oc代碼:
@property (copy, nonatomic) NSString *testStr;
使用方法如下:
[代碼]c#/cpp/oc代碼:
01 NSMutableString *str3 =[[NSMutableString alloc ]initWithString:@"Mutable String"
05 self.testStr = str3;
09 NSLog(@"%d", [self.testStr retainCount]);
11 NSLog(@"%d", [str3 retainCount]);
可以看到testStr和str3地址不同啥刻,retainCount都是1
如果把copy改為retain,那么他們指向相同的地址咪笑,retainCount為2.
明白了吧可帽,retain是指針copy,指向同一地址窗怒,計(jì)數(shù)加1映跟,而copy是把內(nèi)容復(fù)制過來。