OC中類的屬性
前言
在OC的類中,我們想把自己一些類裡面的變量給隐藏起來,就要用到@protected還有@private,而對這些變量進行指派還有調用,就要用到設定器(setter)與通路器(getter),但是我們會發現,如果用到标準的設定器和通路器的定義的話,代碼量會非常的大,如果在制作大程式的時候,會使代碼非常的“累贅”。那麼,有沒有簡便的方法呢,這時候就要用到我們今天所說的類的屬性。
标準的設定器與通路器格式例子:
屬性的聲明
@property NSString *homeAddress;
相當于聲明了設定器 與 通路器-(void)setAddress:(NSString*) address;與-(NSString *)address;
而屬性的使用也非常簡單:
在.h檔案中的文法為:
@property (readwrite,nonatomic,strong) NSString *name;
@property (readonly,nonatomic,assign)NSInteger age;
@property NSString *homeAddress;
在.m檔案中的文法為:
@synthesize homeAddress =_homeAddress;
注意:
如果我們@synthesize 注釋掉 這個時候系統會為我們産生下劃線開頭的變量
_homeAddress
通路讀寫 原子性,記憶體管理
1.存取方法名稱
系統預設的存取方法名稱 propertyName 和 setPropertyName ,例如name 和 setName:方法,這樣做友善采用點文法,可以采用預設的存取方法。
getter=getterName
setter=setterName
注意,如果改變了getter和setter方法名稱,則必須提供自定義的方法。
2.屬性的定義的相關文法
通路讀寫
readonly 指明屬性是隻讀的,系統隻會産生getter,而不會産生setter方法‘
readwrite 指明屬性是可讀寫的,這是預設的,是以可以省略
對于隻讀屬性,如果試圖通過點文法指派,會編譯錯誤
原子性
atomic 原子操作,這是預設的
nonatomic 非原子操作,一般就使用nonautomic,但是沒有辦法保證在多線程環境下不出錯。
記憶體管理
retain
會通過retain來持有目标屬性對象,之前的對象會接收到釋放的消息
copy
會通過copy複制對象,之前的對象會接收到釋放的消息
assign
采用簡單的指派方法,這是預設的方法
strong
表示強引用關系,即擁有目标對象的所有權
weak
表示弱引用關系,不擁有目标對象的所有權。當目标對象被銷毀之後,屬性隻會被自動設為nil。
關于記憶體管理這幾個文法的差別
strong 相當于retain 或者是copy,當我們這個屬性是對象(NSString)的時候,我們就要用這三個strong、retain 、copy。
weak 相當于 assgin,基本資料類型就要用到assgin或者weak來描述。
點文法
在主函數main中我們可以對其通過點文法引用:
NewStudent *newStudent1=[[NewStudent alloc]initWithName:@"Wsss" Age:23 HomeAddress:@"Wsss"];
NewStudent *newStudent2=[NewStudent newStudentWithName:@"Wsss" Age:23 HomeAddress:@"Wsss"];
newStudent1.name[email protected]"sss";
newStudent2.name[email protected]"asdas";
NewStudent *newStudent=[[NewStudent alloc]init];
newStudent.name[email protected]"Rick";
// newStudent.age[email protected]"25";
newStudent.homeAddress[email protected]"GZ";
NSLog(@"%@",newStudent.name);