attributes | |
---|---|
Attributes | Attributes |
atomic | nonatomic |
strong | weak |
readwrite | readonly |
getter | setter |
copy | assign |
retain | unsafe_unretained |
atomic
如果沒有指明是nonatomic的狐胎,那么默認就是atomic醉冤。atomic的意思是數(shù)據(jù)的讀寫是線程安全的
韩容,這在多線程的時候非常有用艺骂,但是與nonatomic相比的話效率會低很多汞舱。所以為了提升效率界睁,除非是在明確知道對象會在多線程中使用,否則盡量使用nonatomic關鍵字兵拢。
nonatomic
nonatomic不能保證數(shù)據(jù)的原子性翻斟,也就是說在多線程訪問的時候不能保證能夠正確讀取數(shù)據(jù),甚至有可能發(fā)生崩潰说铃。如果使用了nonatomic關鍵字访惜,這時候如果存在多線程訪問的話,需要自己來處理線程的安全問題腻扇。
retain
ARC之前使用的關鍵字债热,ARC之后用strong代替。
strong
這是一個ARC之后才有的屬性幼苛,在使用ARC的時候窒篱,這是一個默認屬性。與它對應的是weak屬性舶沿。strong使類能夠擁有對象的所有權
墙杯,會增加對象的 retain count
以保證在類使用該對象的時候,對象沒有被銷毀括荡。strong可能會導致retain cycle
高镐,要謹慎使用,常使用在繼承自NSObject的類和大部分自定義類
畸冲。
官方文檔介紹:
// The following declaration is a synonym for: @property(retain) MyClass *myObject;
@property(strong) MyClass *myObject;
表示了strong和retain是同義詞嫉髓。
unsafe_unretained
ARC之前使用的關鍵字,類似于weak邑闲,但與weak不同的是在對象被銷毀后算行,指針不會被置為空,所以有可能會造成崩潰
weak (weak 對象釋放的時候苫耸,怎么置為nil的呢州邢?請閱讀iOS 底層解析weak的實現(xiàn)原理)
只是將指針指向該對象
,但是并沒有對象的所有權
鲸阔,在對象被釋放的時候偷霉,weak指針會被置為nil,這保證了指針的安全褐筛, 在OC里是可以給nil對象發(fā)送消息而不會崩潰的
类少,但是如果給一個被釋放的對象發(fā)送消息就會崩潰了
。weak不會增加對象的 retain count
渔扎。
assign
簡單數(shù)據(jù)類型
(int硫狞,long,double晃痴, float残吩,Bool)默認就是assign的,不改變對象的retainCount
倘核。最好是只在簡單數(shù)據(jù)類型時使用泣侮,對于對象類型,最好不要使用
readwrite
所有的屬性默認都是readwrite的紧唱,使用readonly關鍵字可以覆蓋該默認值活尊。
readonly
表示對象是只讀的。當我們不希望外面的類可以修改該屬性的時候漏益,可以在頭文件中將屬性定位readonly蛹锰,但是在實現(xiàn)文件中,我們可以將它聲明為readwrite绰疤,這樣就只能在類內(nèi)部才能修改這個屬性了铜犬。
getter
指定get方法, 并需要實現(xiàn)這個方法. 必須返回與聲明類型相同的變量,沒有參數(shù).
setter
指定 set 方法, 并需要實現(xiàn)這個方法. 帶一個與聲明類型相同的參數(shù), 沒有返回值(返回nil)當聲明為 readonly 的時候, 不能指定 set 方法.
默認情況下,系統(tǒng)會生成一個與屬性同名的getter轻庆、setter 方法癣猾,
copy copy還是strong?用copy還是mutablecopy
與strong不同的是余爆,copy不會增加對象的 retain count
煎谍,
而是會重新復制
一份對象,然后將指針
指向新復制
的對象龙屉。
使用copy關鍵字的屬性的類型必須遵循NSCopying
協(xié)議呐粘。
含有可深拷貝
的NSCopy
子類的類,如NSArray
,NSSet
, NSDictionary
, NSData
, NSCharacterSet
, NSIndexSet
, NSString
等一般都用copy來修飾. 這是因為父類的指針可以指向子類對象
, 使用copy的目的就是為了對象本身不受外界影響
, 無論傳給我一個可變還是不可變的對象, 我本身持有的都是一個不可變對象.
假如有一個屬性是NSString類型的转捕,但是我們卻將一個NSMutableString賦值給了它(這是合法的)作岖,如果我們使用strong關鍵字,那么現(xiàn)在這個對象是一個NSMutableString的對象五芝,如果在別的地方修改了這個對象的值痘儡,那么該屬性也跟著變了,這可能會帶來意想不到的后果枢步。但如果我們使用copy關鍵字的話沉删,就不會存在這個問題了渐尿,因為它會拷貝一份NSMutableString的值,這時屬性依然是 immutable 的矾瑰,即使NSMutableString的對象修改了也不會影響屬性的值砖茸。
DemoBlock內(nèi)部沒有調(diào)用外部變量時存放在全局區(qū)(ARC和MRC下均是)
DemoBlock2使用了外部變量,這種情況也正式我們平時所常用的方式,Block的內(nèi)存地址顯示在棧區(qū),棧區(qū)的特點就是創(chuàng)建的對象隨時可能被銷毀,一旦被銷毀后續(xù)再次調(diào)用空對象就可能會造成程序崩潰,在對block進行copy后,block存放在堆區(qū).所以在使用Block屬性時使用Copy修飾,而在ARC模式下,系統(tǒng)也會默認對Block進行copy操作
@synthesis
告訴編譯器自動生成屬性的 getter 和 setter 方法,并且為屬性綁定一個成員變量
,也就是說將屬性的訪問器方法作用于綁定的成員變量。正常情況下可以不使用@synthesis關鍵字破花,編譯器也會默認生成訪問器方法书斜,在一些特殊情況下,需要明確使用@synthesis關鍵字才能生成訪問器方法,包括以下情況:
綁定非默認的實例變量。
默認情況下,系統(tǒng)會生成一個_ 的成員變量與屬性綁定在一起征绎,如果不想使用系統(tǒng)生成的成員變量的話,可以通過@synthesis name = customName來綁定一個自定義的成員變量名磨取。協(xié)議中定義的屬性炒瘸。
當類實現(xiàn)的協(xié)議中包含屬性時,必須在類中明確使用@synthesis才能生成訪問器方法重寫訪問器方法寝衫。
在重寫 getter 和 setter 的時候需要用與屬性相關的成員變量顷扩,由于重寫了 getter 和 setter ,系統(tǒng)不會在默認合成這兩個方法慰毅,也不會默認生成一個帶下劃線的成員變量隘截,這時需要使用@synthesis關鍵字來定一個與屬性對應的成員變量。類別(category)中定義的所有屬性
重載的屬性
重寫了 setter 和 getter 或者只讀屬性的getter時
@dynamic
目的是告訴編譯器訪問器方法沒有本類中實現(xiàn)汹胃,而是在別的地方(比如父類)中實現(xiàn)了婶芭,編譯器就不會再發(fā)出警告了。主要是用在CoreData的NSManagedObject子類中着饥。