OC高效率52之對象內部儘可能直接訪問實例變量

@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
相關文章
相關標籤/搜索