iOS Objective C的屬性修飾符

2021-07-10 04:58:31 字數 2460 閱讀 7616

在蘋果引入了arc之後,屬性的也相對應的增加了一些修飾符。所以這裡我們分別對mrc和arc兩種情況下的屬性修飾符進行學習。其實主要的區別集中在對物件生命週期進行描述的屬性修飾符會有所區別而已。

任何屬性都可以宣告為readwrite或readonly,且預設設定為readwrite。

此外,還可以自定義setter/getter方法。

@propery(setter=setid,getter=getid) int id;
首先我們先區分一下在mrc和arc下的屬性都有使用哪些關於生命週期管理的修飾符。

mrc: assign, copy, retain

arc: strong, weak, unsafe_unretained, copy

然後我們對於每種屬性修飾符做進一步說明,然後對他們之間的對比也進行說明。

assign: 簡單賦值,不更改引用計數。一般用於基礎型別的資料(nsinteger)和c語言型別資料(int,float,double,char,bool)。其在mrc下是預設值。

copy: 會拷貝傳入的物件(即建立乙個引用計數為1的新物件,但是內容與傳入物件相同),並把新物件賦值給例項變數。常用與nsstring,nsarray,nsdictionary,nsset等。

retain: 釋放舊物件,並使傳入的新物件引用計數+1。此屬性只能用於nsobject及其子類,而不能用於core foundation(因為其沒有使用引用計數,需要另外使用cfretain和cfrelease愛進行cf的記憶體管理)。

arc加入的屬性修飾符如下。

strong: 強引用,類似於retain。要求保留傳入的物件,並放棄原有物件。乙個物件只要被至少乙個強引用指向,則其不會被釋放,而當沒有強引用指向時則會被釋放。其在arc下是物件型別的預設值。

weak: 弱引用,要求不保留傳入的屬性(既不會使傳入的物件引用計數+1)。類似於assign,但與assign不同的是,當它們指向的物件被釋放後,weak會被自動置為nil,而assign則不會,所以assign會導致「野指標」的出現,weak可以避免懸空指標。

unsafe_unretained: 其實質等同於assign。與weak的區別就是指向的物件如果被釋放,其不會被置為nil,而導致懸空指標的出現。它是arc模式下非物件屬性的預設值。

所以綜上所述,屬性的預設值主要有以下情況。

1) copy/retain

答:copy會拷貝建立乙個新的物件,並使得它的引用計數為1。retain則是release舊值,retain新值,其本質是指標複製(淺複製),引用計數加1,而不會導致內容被複製。

如:乙個nsstring物件,記憶體位址為:0x1111,內容為@「hello」。

(1)copy到另外乙個nsstring後,位址為0x2222,內容相同(新建乙個內容,內容拷貝),新的物件引用計數為1,舊的物件內容沒有改變,引用計數-1。

(2)retain到另外乙個nsstring後,位址相同(新建乙個指標,指標拷貝),內容相同,物件的引用計數+1。

2)assign/retain(mrc情況下)

答:assign只是簡單的賦值,如果它引用的物件被釋放了,則會造成懸空指標的出現,此時再通過該引用訪問物件則會導致程式crash。retain則是在引用計數的基礎上,對物件引用計數+1,以獲取物件的擁有權,這樣只有當物件的引用計數為0時才會被釋放(既沒有別的引用指向它),這樣可以避免訪問乙個被釋放的物件。

3)assign/weak(arc情況下,因為assign類似於unsafe_unretained,所以也可以說是weak和unsafe_unretained的區別)

答:assign不同的是,當它們指向的物件被釋放後,weak會被自動置為nil,而assign則不會,所以assign會導致「野指標」的出現。

上面那些屬性描述符都是針對類中定義的屬性而言的,實際上對於區域性變數也有類似的關鍵字來修飾變數,常用主要有__strong,__weak,__unsafe_unretained, __autoreleasing。

__string: 是預設引用型別的關鍵字。

__weak: 宣告乙個可以自動置nil的弱引用。

__unsafe_unretained: 弱引用,但是當指向物件被釋放時,不會被置nil。所以會導致野指標的出現。

__autoreleasing:用來修飾乙個函式的引數,這個引數會在函式返回的時候被自動釋放。

有些類有兩個版本:乙個是可修改的,另乙個是不可修改的。無論是哪個版本,copy方法都會返回不可修改的版本。例如,nsmutablestring的copy方法會返回nsstring例項。如果要拷貝可修改的物件,就要使用mutablecopy。

objective-c程式設計(第2版)

objective-c——retain/copy/assign/atomic/nonatomic/strong/weak/readonly/readwrite詳解

ios arc關鍵字說明

iOS Objective C的單件模式

其方式是重寫release,retain,retaincount,autorelease,allocwithzone和copywithzone等方法。1 重寫allocwithzone和copywithzone的目的是外部在多次呼叫alloc的時候,內部能夠確保物件只建立了一次。2 重寫releas...

iOS objective c產生隨機數的方法

objective c 中三種產生隨機數的方法 arc4random 比較精確不需要生成隨即種子 通過arc4random 獲取0到x 1之間的整數的 如下 int value arc4random x 獲取1到x之間的整數的 如下 int value arc4random x 1 ccrandom...

android layout weight屬性學習

雖然這個android layout weight屬性很怪異,但幸運的是我們達到了目標 按比例顯示linearlayout內各個子控制項,需設定android layout width 0dp 如果為豎直方向的設定android layout height 0dp 在這種情況下某子個控制項占用lin...