在對象以外訪問實例變量時,應該經過屬性來作,然而在對象內部訪問實例變量,強烈建議讀取實例變量的時候經過直接訪問的形式,而在設置實例變量的時候經過屬性來作。函數
直接訪問實例變量,不通過OC 的 "方法派發" (下篇寫),訪問速度快,編譯器生成的代碼會直接訪問保存對象實例變量的內存spa
直接訪問實例變量,不會調用 設置方法,繞過了相關屬性所定義的「內存管理語義」,例如在ARC 中,直接方法copy的屬性,不會拷貝而是直接覆蓋調試
直接訪問實例變量,不會觸發KVOcode
經過屬性訪問,能夠設置斷點調試對象
綜合上面的狀況:在寫入實例變量時,經過 設置方法 來作,而在讀取的時候 ,經過直接訪問的方式。既能夠提升讀取操做速讀,又能控制對屬性的寫入,保證相關屬性的 "內存管理語義" 得以貫徹。blog
懶加載的狀況下,必須經過 獲取方法 來訪問屬性,或者,實例變量不會別初始化內存
-(NSArray *)array{ if (!_array) { _array = @[@"aa",@"bb"]; } return _array; }
== 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
使用懶加載時,須要經過屬性來讀取數據