建立乙個索引數為一的物件,然後釋放舊物件。
簡單賦值,不更改索引計數。
arc 下預設模式,釋放舊物件,引用新物件,並使新物件的計數器加一。使用絕大部分 nsobject 物件。
引用新物件,該物件的計數器不加一。
表示這個屬性是唯讀的,只生成getter方法,不會生成setter方法。
可讀可寫(預設)設定可訪問級別,arc 下預設修飾符。
mrc 下的strong
,釋放(release)舊物件,引用新物件,並使新物件的計數器加一。
非原子性訪問,不加同步,多執行緒併發訪問會提高效能。
原子性訪問,最屬性的setter
和getter
進行加鎖操作以保證值的完整性。
為什麼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...