我最近阅读了一篇关于不再需要在ViewControllers上声明ivars以及属性的帖子,并且在我注意到它们时已经从我的代码中删除了重复的声明。
我注意到的一个非常令人费解的效果是,如果该属性缺少声明的ivar,则需要在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.
的情况下访问变量时出现问题,我会发现编译时或运行时错误,但它似乎只是默默地失败,使其变得难以调试。
答案 0 :(得分:1)
调用ivar(直接访问)并使用self.myIvar(这是一种存取方法 - 属性 - )是不一样的。
当您使用直接ivar访问时,它不会通知观察者,因此不会触发某些事件。最好使用self.myIvar(有些人不会同意)。
阅读非常详细且非常有趣的answer in the link。
另一个好处是合成这样的属性:
@synthesize myIvar = myIvar_;
这将确保您避免错误地直接访问ivar(忘记“自我”。)