@interface EOCPerson : NSObject //在對象外訪問實例變量時,老是應該經過屬性來作。 //對象內呢? //建議:讀取實例變量的時候採用直接訪問的形式,設置實例變量時經過屬性來作 @property (nonatomic,copy) NSString *firestName; @property (nonatomic,copy) NSString *lastName; @property (nonatomic,copy) NSString *brain; -(NSString *)fullName; -(void)setFullName:(NSString *) fullName; @end #import "EOCPerson.h" @implementation EOCPerson //運用點語法實現 //-(NSString *)fullName //{ // return [NSString stringWithFormat:@"%@ %@",self.firestName,self.lastName]; //} //-(void) setFullName:(NSString *)fullName //{ // NSArray *components = [fullName componentsSeparatedByString:@" "]; // self.firestName = [components objectAtIndex:0]; // self.lastName = [components objectAtIndex:1]; //} //直接訪問實例變量 -(NSString *)fullName { return [NSString stringWithFormat:@"%@ %@",_firestName,_lastName]; } -(void)setFullName:(NSString *)fullName { NSArray *components = [fullName componentsSeparatedByString:@" "]; _firestName = [components objectAtIndex:0]; _lastName = [components objectAtIndex:1]; } /**這兩種寫法的區別 * 1.直接訪問實例變量的速度比較快 2.直接訪問實例變量,繞過了屬性的定義,好比copy 屬性,並不會拷貝,只會保留新值並釋放舊值 3.直接訪問實例變量,不會觸發kvo 鍵值觀測 4.經過屬性來訪問,有助排查相關錯誤,由於能夠在方法內打斷點 */ //折中方案,在寫入實例變量時,經過屬性「設置」方法來作,讀取實例變量時,則直接訪問 /** * 在初始化方法種,應該直接訪問實例變量:這樣能夠提升讀取速度,又能控制對屬性的寫入操做 */ /** * 惰性初始化:這種狀況下,必須經過「獲取方法」來訪問屬性,不然實例變量就永遠不會初始化。 */ -(NSString *)brain { if (!_brain){ _brain = [NSString new]; } return _brain; } @end