成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iOS中assign、copy、retain關鍵字的含義

移動開發 iOS
本文為讀者朋友們認真總結了assign、copy、retain關鍵字的含義,區別等。希望讀者朋友通過本文的閱讀理解與學習,進一步清楚這幾個關鍵字的區別,含義和用法。

現在開始為讀者朋友們詳細介紹了assign、copy、retain關鍵字的含義,區別等。

assign: 簡單賦值,不更改索引計數
copy: 建立一個索引計數為1的對象,然后釋放舊對象
retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1

Copy其實是建立了一個相同的對象,而retain不是:
比如一個NSString對象,地址為0×1111,內容為@”STR”
Copy到另外一個NSString之 后,地址為0×2222,內容相同,新的對象retain為1, 舊有對象沒有變化

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

也就是說,retain是指針拷貝,copy是內容拷貝。在拷貝之前,都會釋放舊的對象。

* 使用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函數會變成下面這樣:

  1. if (property != newValue) { 
  2. [property release]; 
  3. property = [newValue retain]; 

關于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,非原子性訪問,不加同步,多線程并發訪問會提高性能。注意,如果不加此屬性,則默認是兩個訪問方法都為原子型事務訪問

  1. @property(nonatomic, retain) UITextField *userName編譯時自動生成的代碼 
  2. - (UITextField *) userName { 
  3. return userName; 
  4. - (void) setUserName:(UITextField *)userName_ { 
  5. [userName release]; 
  6. userName = [userName_ retain]; 
  7. @property(retain) UITextField *userName自動生成的代碼 
  8. - (UITextField *) userName { 
  9. UITextField *retval = nil; 
  10. @synchronized(self) { 
  11. retval = [[userName retain] autorelease]; 
  12. return retval; 
  13. - (void) setUserName:(UITextField *)userName_ { 
  14. @synchronized(self) { 
  15. [userName release]; 
  16. userName = [userName_ retain]; 
  17. }

介紹完了assigne、copy、retain關鍵字含義之后,相信你一定自己有了初步的理解和自己的想法,歡迎交流探討。

責任編輯:閆佳明 來源: cnblogs
相關推薦

2013-08-21 10:53:46

iOS定義區別

2017-10-20 11:12:12

數據類型關鍵字對象

2022-05-06 08:32:40

Pythonwith代碼

2023-11-19 22:52:42

2012-06-02 00:53:39

Javafinally

2020-08-10 08:00:13

JavaFinal關鍵字

2013-03-25 13:41:10

iOS5ARC內存管理

2024-08-16 09:06:03

2024-08-06 16:28:57

2011-06-14 13:26:27

volatile

2024-11-20 15:55:57

線程Java開發

2024-02-23 18:04:37

C++const關鍵字

2011-07-14 23:14:42

C++static

2024-03-15 15:12:27

關鍵字底層代碼

2022-11-12 18:32:50

Golangomitemptyjson

2022-02-17 08:31:38

C語言staic關鍵字

2021-02-01 13:10:07

Staticc語言UNIX系統

2025-01-09 10:30:40

2024-01-07 20:15:49

Python編程語言

2019-12-17 08:16:04

JavaScriptthis編程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久国产一区二区三区四区 | 亚洲成人黄色 | 亚洲精品电影网在线观看 | 精品一区二区三区免费视频 | 不卡一区二区三区四区 | 一级网站| 色视频网站 | 日本在线播放 | 免费小视频在线观看 | 久久久久黄 | 欧美日韩视频在线 | 欧美性受xxxx白人性爽 | 色综合美女 | 综合激情久久 | 久久99网站 | 欧美一级黄视频 | 一区二区三区国产视频 | 国产精品污www一区二区三区 | 国产三级一区二区三区 | 91在线看| 日韩一区二区三区四区五区六区 | 中文字幕在线视频精品 | 日韩精品视频在线免费观看 | 亚洲国产一区二区三区 | av色在线 | 国产十日韩十欧美 | 四虎永久免费地址 | 久久久久国 | 国产传媒视频在线观看 | 国产一区二区三区免费 | 黄色片在线 | 欧美日韩一区二区视频在线观看 | 欧美 日韩 国产 成人 在线 | 亚洲先锋影音 | 亚洲成人免费视频在线 | 欧美国产激情 | 久久久日韩精品一区二区三区 | 日韩一区二区三区四区五区六区 | 依人成人 | 婷婷久久久久 | 国产一级视频在线播放 |