@property基本用法
->作用:在@interface自動生成getter和setter方法的聲明
->使用格式:
@property 數據類型 名稱
->作用流程
在編譯器編譯的時候.會根據這個@property自動的生成getter setter方法的聲明.
->使用注意:
1). @property的類型要和屬性的類型一致.
2). @property的名稱要和屬性的名稱一致(只是去掉下划線)
3). @property可以批量聲明.
當@property的類型相同的時候,可以批量聲明.
4). @property只是生成getter setter的聲明.
->例:
@synthesize用法
->作用:在@implementation自動生成getter和setter方法的實現
->使用格式:
@synthesize 名稱
注意,這個名稱必須要是在@interface中的@property聲明的名稱
->作用流程:
1).先生成1個真私有屬性,類型和名稱與@synthesize聲明的類型一致
2).自動生成setter的方法實現
3).自動生成getter的方法實現
->例:
注:若不想生成私有屬性,則用 @synthesize 去_名稱 = 名稱;類型不同也可批量實現
@property增強用法
->來源:
Xcode4.4之后@property被增強,會自動生成帶_的真私有屬性,並自動生成該屬性的setter和getter聲明和實現,以后除了特殊情況就沒必要再特別寫屬性,setter和getter方法了.
->使用注意:
1). @property的類型要和需要生成的屬性的類型一致且名稱要和想要生成的屬性的名稱一致.去掉下划線.
2). @property也是可以批量聲明的. 前提是型相同的情況下.
3). @property生成的方法實現是沒有任何邏輯驗證的.如果你有邏輯驗證,可以自己重寫.如果你只重寫了setter方法或者getter方法,@property仍然會自動生成私有屬性另一個方法.當你同時重寫了getter setter,那么@property就不會自動生成私有屬性了.
->例:
@property帶參數用法
1) 語法: @property(參數1,參數2,參數3.....)數據類型 名稱;
2)和多線程相關的參數
atomic:默認值,對屬性加鎖,多線程下保證線程安全
nonatomic:對屬性不加鎖,多線程下不安全,但速度快
2)與生成的setter方法實現相關參數(具體詳見內存管理)
assign:默認值,在MRC和ARC模式下都可使用,在生成的setter方法中直接賦值.當屬性類型為非OC對象時一律使用assign,在MRC模式下出現循環引用時,一邊使用strong,一邊使用assign
retain:只能在MRC模式下使用,當屬性類型是OC對象時,在生成的setter方法中使用標准的MRC內存管理代碼
strong:只能在ARC模式下使用,當屬性類型是OC對象時,絕大多數場景下使用strong
weak:當在ARC模式下出現循環引用則一邊使用strong,另一邊使用weak;
3)判斷是否生成只讀或讀寫的封裝參數
readwrite:默認值,同時生成getter和setter方法
readonly:只生成getter方法
4)指定生成的getter,setter方法名稱
例如getter = 所指定的方法名
注:以上2)~4)的參數同一組只能使用1個
點語法
->作用:快速調用對象的setter/getter方法
->原理:點語法是一個編譯器特性,編譯器在編譯的時候其實就已經把點語法轉換為調用getter/setter方法的代碼.
如果是通過點語法賦值,就轉換為調用setter方法的代碼;如果通過點語法取值,那么久轉換為調用getter方法的代碼.
->語法:
為屬性賦值: 對象名.去掉下划線的屬性名 = 數據
要取出屬性的值: 對象名.去掉下划線的屬性名
->使用注意:
1) 只有為對象聲明和定義了規范的setter/getter方法才能使用點語法來調用
2) 在getter和setter方法中慎用點語法,防止出現死循環.
