iOS 基礎 屬性修飾符

2021-08-07 06:46:05 字數 2710 閱讀 1189

建立乙個索引數為一的物件,然後釋放舊物件。

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

arc 下預設模式,釋放舊物件,引用新物件,並使新物件的計數器加一。使用絕大部分 nsobject 物件。

引用新物件,該物件的計數器不加一。

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

可讀可寫(預設)設定可訪問級別,arc 下預設修飾符。

mrc 下的strong,釋放(release)舊物件,引用新物件,並使新物件的計數器加一。

非原子性訪問,不加同步,多執行緒併發訪問會提高效能。

原子性訪問,最屬性的settergetter進行加鎖操作以保證值的完整性。

為什麼nsstring、nsdictionary、nsarray要使用copy修飾符呢?

要搞清楚這個問題,我們先來弄明白深拷貝與淺拷貝的區別,以非集合類與集合類兩種情況來進行說明下,先看非集合類的情況,**如下:

nsstring *name =

@"lolita"

;nsstring *newname = name.copy;

nslog

(@"name address:%p ---- newname address:%p"

,name,newname)

;

輸出資訊如下:

name address:0x1000d0520 ---- newname address:0x1000d0520
可以看出複製過後,記憶體位址是一樣的,沒有發生變化,這就是淺拷貝,只是把指標的位址複製了乙份;

我們修改**為name.mutablecopy,此時輸出的資訊圖下:

name address:0x1000f4520 ---- newname address:0x17426fb40
此時記憶體位址發生了變化,並且newname的記憶體位址的偏移量比name的記憶體位址大許多,由此可見name經過mutablecopy操作之後,被複製到新的區域了,這就是深拷貝,深拷貝不僅拷貝位址還拷貝了內容。

上面的都是不可變物件,在看下可變物件的情況,**如下:

nsmutablestring *name =

[[nsmutablestring alloc] initwithstring:

@"lolita"];

nsmutablestring *newname = name.copy;

nslog

(@"name address:%p ---- newname address:%p"

,name,newname)

;

輸出資訊如下:

name address:0x17026cdc0 ---- newname address:0xa004154494c4f4c6
name address:0x17007a380 ---- newname address:0x17007d6c0
可以看出可變物件copy與mutablecopy的效果是一樣的,都是深拷貝。

總結:對於非集合類物件的copy操作如下:

採用同樣的方法可以驗證集合類物件的copy操作如下:

對於nsstring、nsdictionary、nsarray等經常使用copy關鍵字,是因為它們有對應的可變型別:nsmutablestring、nsmutabledictionary、nsmutablearray,它們之間可能進行賦值操作,為確保物件中的字串值不會無意間變動,應該在設定新屬性時拷貝乙份。

分別使用兩種修飾符來修飾nsarray

@property

(copy ,nonatomic) nsarray *bookarray1;

@property

(strong ,nonatomic) nsarray *bookarray2;

nsmutablearray *books =

[nsmutablearray arraywithobject:

@"book1"];

self

.bookarray1 = books;

self

.bookarray2 = books;

[books addobject:

@"book2"];

// 當陣列改變時

nslog

(@"bookarray1:%@"

,self

.bookarray1)

;nslog

(@"bookarray2:%@"

,self

.bookarray2)

;

輸出結果:

bookarray1:

( book1

)bookarray2:

( book1,

book2

)

由此可以看出,books 被改變時,strong 修飾的 bookarray2 也隨之改變。

這說明strong對books進行淺拷貝,只拷貝了指標,books 和 bookarray2 指向同乙個位址,內容是一樣的。

而copy對books進行了深拷貝,是針對內容進行了拷貝,所以books的改變不會影響到bookarray1。

iOS 屬性修飾符

1.讀寫性修飾符 readwrite readonly readwrite 表明這個屬性是可讀可寫的,系統為我們建立這個屬性的setter和getter方法。readonly 表明這個屬性只能讀不能寫,系統只為我們建立乙個getter方法,不會建立setter方法 2.setter相關修飾符 ass...

IOS中的屬性修飾符

1.assign,setter方法直接賦值,不進行任何retain操作,為了解決原型別與環循引用問題.2.retain,setter方法對引數進行release舊值再retain新值,所有實現都是這個順序.3.copy,setter方法進行copy操作,與retain處理流程一樣,先舊值releas...

iOS之OC隨筆 屬性修飾符

記憶體管理一直是oc的重點內容,而屬性的記憶體管理從我們開始編寫第一句ios 就伴隨著我們,其重要程度可見一斑。下面是oc記憶體管理修飾符的總結,只是寫出最常用的幾個屬性的記憶體管理修飾符,適用範圍arc。簡單總結 基本資料型別用assign,物件用strong,和ui控制項用weak,字串用cop...