IOS OC 對象內部儘可能直接訪問實例變量

在對象以外訪問實例變量時,應該經過屬性來作,然而在對象內部訪問實例變量,強烈建議讀取實例變量的時候經過直接訪問的形式,而在設置實例變量的時候經過屬性來作。函數


一 self.property 和_property 區別

  • 直接訪問實例變量,不通過OC 的 "方法派發" (下篇寫),訪問速度快,編譯器生成的代碼會直接訪問保存對象實例變量的內存spa


  • 直接訪問實例變量,不會調用 設置方法,繞過了相關屬性所定義的「內存管理語義」,例如在ARC 中,直接方法copy的屬性,不會拷貝而是直接覆蓋調試


  • 直接訪問實例變量,不會觸發KVOcode


  • 經過屬性訪問,能夠設置斷點調試對象


綜合上面的狀況:在寫入實例變量時,經過 設置方法 來作,而在讀取的時候 ,經過直接訪問的方式。既能夠提升讀取操做速讀,又能控制對屬性的寫入,保證相關屬性的 "內存管理語義" 得以貫徹。blog


二 注意點

2.1 懶加載

懶加載的狀況下,必須經過 獲取方法 來訪問屬性,或者,實例變量不會別初始化內存

-(NSArray *)array{
    if (!_array) {
        _array = @[@"aa",@"bb"];
    }
    return _array;
}


2.2 不要在 init 和 dealloc 方法中使用 self.property

== init
-(id)init {
     self = [super init];
     if (self) {
          _count = [[NSNumber alloc] initWithInteger:0];
     }
     return self;
}

== dealloc
- (void)dealloc {
     [_count release];
     [super dealloc];
}

在 init 和 dealloc 中,對象的存在與否還不肯定,因此給對象發消息可能不會成功。請詳細查看 巧哥這篇 不要在init和dealloc函數中使用accessorget



三 總結

在對象內部讀取數據時,應該直接經過實例變量來讀,在寫入數據時,則應該經過屬性來寫編譯器

在初始化方法和 dealloc 方法中,應該直接通實例變量名直接來讀寫數據,避免用self.property訪問it

使用懶加載時,須要經過屬性來讀取數據

相關文章
相關標籤/搜索