property 屬性講解

property 後面括號中的屬性(nonatimic,retain,assign,copy,readonly,readwrite,)這些屬性主要事完成getter setter 的操作  
(這個很重要的哦 !!!很多初學者都在這裏迷惑哦~~~) 
------------------------------------------------
assign: 簡單的賦值  不會更改索引計數(Reference  counting)主要是對基本數據類型使用 eg:(NSInteger,CGFloat 和C語言的 int double float char  ...)如果使用對象類型的參數,需要開啓garbage collector
[現在的版本叫引用計數器 不同的版本不同的叫法  在mac編程和在iphone編程中的叫法也不同  諒解 諒解 ] 
retain: 釋放舊的對象 將舊對象的值賦予輸入對象 並將輸入對象的索引計數+1 ,主要應用與NSObject與其子類中,如果啓用了garbage collector 和assign 的作用一樣 
  1. - (void)setName:(NSString *)newName {  
  2.     if (name != newName) {  
  3.        [name release];  
  4.        name = [newName retain];  
  5.        // name’s retain count has been bumped up by 1  
  6.     }  
  7. }  
copy: 創建一個索引計數爲1的對象 釋放掉原來的對象 
readonly:  表示只讀屬性  只會生成getter方法 不會生成setter方法 
readwrite:設置可供訪問的級別 
nonatimic:非原子訪問,不加同步 ,多線程併發訪問提高性能 (對多線程的保護,防止在未寫完,被另一個線程讀取,造成數據錯誤)。
對copy 和retain的 解釋 上面的語言太抽象了 那麼請允許我在這裏對 copy 和 retain 的區別 作詳細的介紹

比如一個NSString 對象,地址爲0×1111 ,內容爲@”STR”

Copy 到另外一個NSString 之後,地址爲0×2222 ,內容相同,新的對象retain爲1 ,舊有對象沒有變化

retain 到另外一個NSString 之後,地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1 

retain 是指針拷貝,copy 是內容拷貝  

下面分享一個網友的總結

 

一直以來個人覺得如果一個類是的property是readonly的那麼再指定其他的如assign/retain/copy這樣的屬性就實在是沒有什麼意義了。確實你想想既然都readonly了,肯定是沒有setter的,既然沒有setter那麼談assign/retain/copy又有什麼意義呢?所以一直以來我從來不對readonly的property加retain/copy屬性申明,默認assign就足夠了,simple is beautiful!

但是我現在發現我錯了,其實一直都有一種這種感覺,只是沒有找到100%的充分理由爲readonly加上retain/copy。但是假如你要在你的subclass改寫property,而加入你要改寫的是一個NSString,你像把這個屬性設置爲readwrite和copy,往往杯具就發生了,編譯時候可惡的warning 產生了,因爲copy和之前默認的assign明顯不相同啊!

終上,不論什麼時候,都要爲你的readonly的對象屬性加上合適的retain/copy申明。你現在不用,但不說明你將來就不會用,出來混遲早都要還的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章