標籤:
一、屬性 屬性是Objective—C 2.0定義的文法,為執行個體變數提供了setter、getter方法的預設實現能在一定程度上簡化程式碼,並且增強執行個體變數的訪問安全性 OC中的屬性機制提供了便捷的設定和擷取執行個體變數的方式,或者說屬性提供了一個預設的設定器和訪問器的實現;屬性提供的方法是現實可配置的,屬性的好處:相當於自己編寫這一對方法,屬性提供了一系列清晰分明的說明參數來定義設定器和訪問器的行為,編譯器可以根據你設定的說明參數為你產生相應的方法,減少你的代碼量和維護工作量 設定器(setter)與訪問器(getter),提供了一個外界操作類內部屬性的通道。因為類的屬性,一般是私人的(private)假如沒有這個方法那麼這個屬性的織就不能被外界所改變
(一)、屬性的定義屬性的聲明:使用@property聲明屬性例如:@property NSString *name;相當於@interface中聲明了兩個方法(setter和getter):- (void)setName:(NSString *)name;- (NSString *)getName;
(二)、屬性的實現屬性的實現:使用@synthesize實現屬性例如:@ynthesize name = _name;相當於@implementation實現了setter、getter- (void)setName:(NSString *)name{——}- (NSString *)getName{——}例如定義一個完整的Person類,包含執行個體變數、屬性、初始化方法、便利構造器方法以及功能方法:h檔案中如下: m檔案中如下: main.m檔案中如下:
二、屬性的屬性Objective-C提供屬性是得目的是為了簡化程式員代碼為屬性提供了一些關鍵字用以控制setter、getter的實現細節這些關鍵字我們稱為屬性的屬性(attribute)一共3大類attribute
第一類:讀寫性控制 (readonly、readwrite、stter、getter)readonly,告訴編譯器,只聲明getter方法(無setter方法)例如:@property(readonly)NSString *name;等價於- (NSString *)getName; readwrite,告訴編譯器,既聲明setter又聲明getter例如:@property(readwrite)NSString *name;等價於 - (void)setName:(NSString *)name;- (NSString *)getName;readwrite是讀寫性控制的預設設定
第二類:原子性控制 (nonatomic、atomic)atomic。setter、getter方法在多線程訪問下是絕對安全的,即setter、getter內部做了多線程訪問處理。原子性控制的預設設定是atomicnonatomic。setter、getter方法內部不會做多線程訪問處理,僅僅是普通的setter、getter方法程式開發過程中,setter、getter處處都在用,如果使用atomic,需要不斷的對setter、getter枷鎖解鎖以保證線程訪問安全,會很佔用系統資源,降低系統效能通常設定為nonatomic,某些屬性需要安全執行緒的時候,才定義為atomic。例如:@property(readwrite,nonatomic)NSString *name;等價於 - (void)setName:(NSString *)name;- (NSString *)getName;
第三類:語義設定 (assign、retain、copy)assign。setter、getter內部實現是直接賦值例如:@property (nonatomic,assign)NSString *name;- (void)setName:(NSString *)name { _name = name;}- (NSString *)name { return _name;}retain。setter、getter放入內部實現會做記憶體最佳化 copy。setter、getter的內部實現也會做記憶體最佳化如果屬性是非物件類型(比如int,float等)屬性的語義設定使用assign如果屬性是物件類型(比如NSString、NSArray等)屬性的語義設定使用retain如果屬性是對象並想得到參數的copy,使用copy關鍵字
三、點文法點文法是Objective-C 2.0中定義的文法格式。提供了一種便捷的屬性訪問方式點文法的使用分時符合系統預設setter、getter書寫格式的方法都可以使用點文法例如:[person1 setName:@“zhangsan”];可以等價寫成person1.name = @“zhangsan”;。 NSString *name = [person1 name];可以等價寫成NSString *name = person1.name;屬性是一對getter、setter方法,點文法是屬性的另一種調用格式使用點文法進行賦值: Person *person = [[Person alloc] init]; person.name = @"zhangsan";
person.age = 33;
person.gender = @"male";
NSLog(@"%@,%ld,%@",person.name,person.age,person.gender);
Objective - C中屬性和點文法的使用