你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS對象屬性詳解

iOS對象屬性詳解

編輯: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和其子類
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved