iOS中retain等關鍵字的含義

2021-06-08 08:07:10 字數 2728 閱讀 6452

分類: ios開發

2012-03-02 15:05

950人閱讀收藏

舉報

assign: 簡單賦值,不更改索引計數

copy: 建立乙個索引計數為1的物件,然後釋放舊物件

retain:釋放舊的物件

,將舊物件的值賦予輸入物件,再提高輸入物件的索引計數為1

那上面的是什麼意思呢?

copy其實是建立了乙個相同的物件,而retain不是:

比如乙個nsstring物件,位址為0×1111,內容為@」str」

copy到另外乙個nsstring之 後,位址為0×2222,內容相同,新的物件retain為1, 舊有物件沒有變化

retain到另外乙個nsstring之 後,位址相同(建立乙個指標,指標拷貝),內容當然相同,這個物件的retain值+1

也就是說,retain是指標拷貝,copy是內容拷貝。在拷貝之前,都會釋放舊的物件。

* assign: 簡單賦值,不更改索引計數(reference counting)。

* copy: 建立乙個索引計數為1的物件,然後釋放舊物件

* retain:釋放舊的物件,將舊物件的值賦予輸入物件,再提高輸入物件的索引計數為1

* 使用assign: 對基礎資料型別 (nsinteger)和c資料型別(int, float, double, char,等)

* 使用copy: 對nsstring

* 使用retain: 對其他nsobject和其子類

1.readonly表示這個屬性是唯讀的,就是只生成getter方法,不會生成setter方法.

2.readwrite,設定可供訪問級別

3.retain,是說明該屬性在賦值的時候,先release之前的值,然後再賦新值給屬性,引用再加1。

4.nonatomic,非原子性訪問,不加同步,多執行緒併發訪問會提高效能。注意,如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。

retain和copy還有assign的區別

1. 假設你用malloc分配了一塊記憶體,並且把它的位址賦值給了指標a,後來你希望指標b也共享這塊記憶體,於是你又把a賦值給(assign)了b。此時a和b指向同一塊記憶體,請問當a不再需要這塊記憶體,能否直接釋放它?答案是否定的,因為a並不知道b是否還在使用這塊記憶體,如果a釋放了,那麼b在使用這塊記憶體的時候會引起程式crash掉。

2. 了解到1中assign的問題,那麼如何解決?最簡單的乙個方法就是使用引用計數(reference counting),還是上面的那個例子,我們給那塊記憶體設乙個引用計數,當記憶體被分配並且賦值給a時,引用計數是1。當把a賦值給b時引用計數增加到2。這時如果a不再使用這塊記憶體,它只需要把引用計數減1,表明自己不再擁有這塊記憶體。b不再使用這塊記憶體時也把引用計數減1。當引用計數變為0的時候,代表該記憶體不再被任何指標所引用,系統可以把它直接釋放掉。

3. 上面兩點其實就是assign和retain的區別,assign就是直接賦值,從而可能引起1中的問題,當資料為int, float等原生型別時,可以使用assign。retain就如2中所述,使用了引用計數,retain引起引用計數加1, release引起引用計數減1,當引用計數為0時,dealloc函式被呼叫,記憶體被**。

4. copy是在你不希望a和b共享一塊記憶體時會使用到。a和b各自有自己的記憶體。

5. atomic和nonatomic用來決定編譯器生成的getter和setter是否為原子操作。在多執行緒環境下,原子操作是必要的,否則有可能引起錯誤的結果。加了atomic,setter函式會變成下面這樣:

if (property != newvalue)

關於retain,copy,assign的區別問題其實困擾我很久了,因為在程式中不太常用到copy,assign,所以三者的具體差別一直不太明白。

按照我的理解,assign和retain的區別,就是引入了乙個計數器retaincount,就可以對乙個記憶體的釋放方便很多。copy,就是把原來的記憶體複製一遍,使各自都擁有乙個記憶體,這樣釋放的時候也不會出錯。

assign: 簡單賦值,不更改索引計數(reference counting)。

copy: 建立乙個索引計數為1的物件,然後釋放舊物件

retain:釋放舊的物件,將舊物件的值賦予輸入物件,再提高輸入物件的索引計數為1

使用assign: 對基礎資料型別 (nsinteger,cgfloat)和c資料型別(int, float, double, char, 等等)

使用copy: 對nsstring

使用retain: 對其他nsobject和其子類

nonatomic,非原子性訪問,不加同步,多執行緒併發訪問會提高效能。注意,如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問

@property(nonatomic, retain) uitextfield *username編譯時自動生成的**

-(uitextfield *

) username -(

void

) setusername:

(uitextfield *

)username_

@property(retain) uitextfield *username自動生成的** -

(uitextfield *

) username

return retval;}-

(void

) setusername:

(uitextfield *

)username_ }

iOS中self關鍵字

self關鍵字 1,例項方法裡面的self,是物件的首位址。2,類方法裡面的self,是class.儘管在同乙個類裡面的使用self,但是self卻有著不同的解讀。在類方法裡面的self,可以翻譯成class self 在例項方法裡面的self,應該被翻譯成為object self。在類方法裡面的s...

iOS 的 property中的關鍵字

所有者屬性 我們先來看看與所有權有關係的屬性,關鍵字間的對應關係。屬性值關鍵字 所有權strong strong 有weak weak 無unsafe unretained unsafe unretained 無copy strong 有assign unsafe unretained 無retai...

IOS 屬性關鍵字

ios 5之後便支援arc了,在arc的情況下物件引用分為 strong強引用 乙個物件如果有乙個及以上的強引用指向它,那麼他將不會釋放 weak弱引用 乙個物件如果只有弱應用指向它,那麼它將被釋放掉 注 兩個物件若相互保留對方的強引用,那麼會照成記憶體洩漏。其他 copy 物件的複製,複製之後得到...