2012-03-31 111 views
0

我最近閱讀了一篇關於不再需要在ViewControllers上聲明ivars和屬性的帖子,並且在我注意到它們的時候從我的代碼中刪除了重複的聲明。ivars不像預期的那樣

我注意到實在令人費解的效果是,如果物業沒有聲明的伊娃,它需要通過self.如前面:

CustomVC.h:

@interface CustomVC : UIViewController <UITableViewDelegate,UITableViewDataSource> { 
... 
@property (nonatomic, strong) IBOutlet UITableView *itemsTableView; 

CustomVC .M:

[itemsTableView reloadData]; // cellForRowAtIndexPath not called 
[self.itemsTableView reloadData]; // table view refreshed as expected 

如果有一個問題,訪問變量沒有self.,我期望編譯時或運行時錯誤,但它似乎只是在默默地失敗,使得調試變得困難。

回答

1

調用ivar(直接訪問)並使用self.myIvar(這是一個訪問器方法 - 屬性)是不一樣的。

當您使用直接ivar訪問時,它不會通知觀察者,因此不會觸發某些事件。使用self.myIvar總是最好的(有些人不會同意)。

閱讀answer in the link這是非常詳細和非常有趣。

換個好點的是合成這樣的特性:(「自我」忘記了)

@synthesize myIvar = myIvar_; 

這將確保你避免錯誤地伊娃直接訪問

+0

我的行爲看到幾乎就像忽略'self.'時,屬性簡單不會更新。 – Echilon 2012-03-31 13:07:42

+0

是的,**省略「自我」。當你使用「self」時,你直接訪問ivar **而不使用property(所以觀察者不會被通知)。你訪問的財產,從而通知觀察員,你的價值改變等 – moxy 2012-03-31 13:25:59

+0

我半懂了。奇怪的是,如果我有例如一個數組屬性,沒有'self.'訪問,我可以添加對象,當我做一個計數後,它仍然是空的。 – Echilon 2012-03-31 14:08:49

相關問題