-
讀寫屬性:
- setter:指定生成setter方法的名字。
- getter:指定生成getter方法的名字糕再,例如
@property (nonatomic, assign, getter=isHidden) Bool hidden
量没。 - readwrite:產(chǎn)生setter和getter方法。
- readonly:只產(chǎn)生getter方法突想,并不能保證完全只讀殴蹄,可以通過kvc進(jìn)行修改賦值。
當(dāng)在持有該屬性所在的類中猾担,加上如下函數(shù)時(shí)袭灯,
+ (BOOL)accessInstanceVariablesDirectly {
return NO;
}
就無法對(duì)readonly修飾的屬性修改了,具體原因打開蘋果的官方文檔找到Key-Value Coding Programming Guide
可以看出绑嘹,如果該函數(shù)返回YES妓蛮,將直接調(diào)用valueForUndefinedKey方法。
-
Setter語義:
- retain:setter方法對(duì)參數(shù)進(jìn)行release舊值圾叼,再retain新值蛤克。
- strong:默認(rèn)修飾詞捺癞,強(qiáng)引用,默認(rèn)所有實(shí)例變量和局部變量都是strong指針构挤,如果一個(gè)對(duì)象被強(qiáng)引用所持有髓介,那么該對(duì)象就不會(huì)被釋放。
- weak:弱引用筋现,即使一個(gè)對(duì)象被持有無數(shù)個(gè)弱引用唐础,只要沒有強(qiáng)引用指向它,那其還是會(huì)被清除矾飞,它不是對(duì)象的擁有者一膨,其值會(huì)在對(duì)象被釋放后自動(dòng)設(shè)置為nil。 weak指針主要用于“父-子”關(guān)系洒沦,父親擁有一個(gè)兒子的strong指針豹绪,因此父親是兒子的所有者,但為了阻止所有權(quán)循環(huán)申眼,兒子需要使用weak指針指向父親瞒津。
- assign:setter方法直接賦值,而不進(jìn)行retain操作括尸,適用于基本數(shù)據(jù)類型巷蚪,對(duì)象類型,不會(huì)發(fā)生引用計(jì)數(shù)變化濒翻。
- copy:setter方法進(jìn)行copy操作屁柏,與retain一樣
-
讀寫屬性:
- atomic:默認(rèn)的屬性修飾詞,按官方文檔上的說明有送,可以在不同線程調(diào)用setter和getter淌喻,但是atomic并不是線程安全的,因?yàn)閍tomic只能保證通過setter和getter方法能獲取到一個(gè)完整的值娶眷,但是如果A線程調(diào)用setter似嗤,B啸臀、C線程調(diào)用getter届宠,可能B、C讀取的是A設(shè)置之后的值乘粒,也可能B先讀了豌注,A在設(shè)置,之后C又讀了灯萍。
- nonatomic:通過nonatomic修飾的屬性轧铁,并沒有做鎖的操作,多線程同時(shí)進(jìn)行setter和getter操作旦棉,并不能保證得到一個(gè)完整的值齿风,所以相對(duì)atomic來說nonatomic修飾的屬性訪問速度更快药薯,而且平時(shí)對(duì)線程安全我們更傾向于使用信號(hào)量和鎖的方式去控制線程安全,他們都能保證代碼塊的原子性救斑,所以幾乎所有的屬性都用nonatomic去修飾童本。
-
空值:
- nullable:表示對(duì)象可以是NULL或nil竖席。
- nonnull: 表示對(duì)象不應(yīng)該為空秒拔。