iOS 對象屬性詳細介紹_IOS

來源:互聯網
上載者:User

iOS 對象屬性

oc對象的一些屬性:

retain,strong, copy,weak,assign,readonly, readwrite, unsafe_unretained

下面來分別講講各自的作用和區別:

retain,計數器加1, (增加一個指向記憶體的指標) 對應release(計數器-1) setter 方法對參數進行 release 舊值再 retain 新值,所有實現都是這個順序

- (void)setBackView:(UIView *)backView {  if (_backView != backView) {    [_backView release];    _backView = [backView retain];  }  return _backView;}

copy, 拷貝,新開地址,內容拷貝, setter 方法進行 Copy 操作,與 retain 處理流程一樣,先舊值 release ,再 Copy 出新的對象, retainCount 為 1 。這是為了減少對內容相關的依賴而引入的機制。

(提一點深拷貝shallow copy,淺拷貝deep copy)

這篇文章比較直觀(http://blog.csdn.net/omegayy/article/details/7311839)

官方文檔(https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Collections/Articles/Copying.html)

copy和mutableCopy調用後表現的行為到底是什麼樣完成取決於類本身NSCopying和NSMutableCopying協議是如何?的。

 strong, 強引用,計數器加1,和retain一樣(對應retain和copy)

weak,弱引用

strong 用來修飾強引用的屬性;@property (strong) SomeClass * aObject; 對應原來的 @property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; weak 用來修飾弱引用的屬性;@property (weak) SomeClass * aObject; 對應原來的 @property (assign) SomeClass * aObject; 

__weak, __strong 用來修飾變數,此外還有 __unsafe_unretained, __autoreleasing 都是用來修飾變數的。
__strong 是預設的關鍵詞。
__weak 聲明了一個可以自動 nil 化的弱引用。
__unsafe_unretained 聲明一個弱應用,但是不會自動nil化,也就是說,如果所指向的記憶體地區被釋放了,這個指標就是一個野指標了。
__autoreleasing 用來修飾一個函數的參數,這個參數會在函數返回的時候被自動釋放。

strong和weak的區別

(weak和strong)不同的是 當一個對象不再有strong類型的指標指向它的時候 它會被釋放  ,即使還有weak型指標指向它。

一旦最後一個strong型指標離去 ,這個對象將被釋放,所有剩餘的weak型指標都將被清除。

可能有個例子形容是妥當的。

想象我們的對象是一條狗,狗想要跑掉(被釋放)。

strong型指標就像是栓住的狗。只要你用牽繩掛住狗,狗就不會跑掉。如果有5個人牽著一條狗(5個strong型指標指向1個對象),除非5個牽繩都脫落 ,否著狗是不會跑掉的。

weak型指標就像是一個小孩指著狗喊到:“看!一隻狗在那” 只要狗一直被栓著,小孩就能看到狗,(weak指標)會一直指向它。只要狗的牽繩脫落,狗就會跑掉,不管有多少小孩在看著它。

只要最後一個strong型指標不再指向對象,那麼對象就會被釋放,同時所有的weak型指標都將會被清除。

assign,用於簡單類型,計數器不加,直接賦值,一個指標,一塊地址, setter 方法直接賦值,不進行任何 retain 操作,為瞭解決原類型與環循引用問題

readonly,唯讀,只產生get方法,沒有set方法

readwrite,預設,可讀寫,set,get方法都會產生

unsafe_unretained,類似weak,所謂的unSafe就是指會容易出現也指標的情況,慎用

setter = xxxx,聲明對象的set方法

getter = xxxx, 聲明對象的get方法

nonatomic,非原子操作,系統不添加代碼,運行速度相對快,但資料操作在多線程情況下相對不安全

atomic,原子操作,編譯時間會增加很多加鎖解鎖代碼,資料操作在多線程情況下相對安全

* 使用assign: 對基礎資料類型 (NSInteger)和C資料類型(int, float, double, char,等)
* 使用copy: 對NSString
* 使用retain: 對其他NSObject和其子類

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.