【问题标题】:ivars not behaving as expected [closed]ivars 的行为不符合预期[关闭]
【发布时间】:2012-03-31 12:31:42
【问题描述】:

我最近阅读了一篇关于不再需要在 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. 的情况下访问变量时出现问题,我预计会出现编译时或运行时错误,但它似乎只是默默地失败,因此难以调试。

【问题讨论】:

    标签: objective-c ios properties ivar


    【解决方案1】:

    调用ivar(直接访问)和使用self.myIvar(访问器方法-properties-)是不一样的。

    当您使用直接 ivar 访问时,它不会通知观察者,因此不会触发某些事件。最好使用 self.myIvar(虽然有些人不同意)。

    阅读answer in the link,非常详细,非常有趣。

    另一个好处是合成这样的属性:

    @synthesize myIvar = myIvar_;
    

    这将确保您避免错误地直接访问 ivar(忘记“自我”。)

    【讨论】:

    • 我看到的行为几乎就像省略 self. 时,属性 simple 没有更新。
    • 是的,省略“self”时。当您使用“self”时,您正在直接访问 ivar 而不是使用属性(因此不会通知观察者)。您正在访问该属性并因此通知观察者您的值已更改,等等。
    • 我明白了一半。奇怪的是,如果我有一个数组属性,在没有 self. 的情况下访问,我可以向它添加对象,然后当我进行计数时,它仍然是空的。
    • NSArray *myArray = [[NSArray alloc] initWithObjects:@"bla",@"bli",@"blo",nil]; NSLog(@"%d",[myArray 计数]);你应该在控制台中得到 3。 “自己。”用于访问类的属性,它表示您将使用的实例。关于您的数组问题,最好用您正在使用的代码块以及使用哪些方法打开另一个问题,因为您的问题也可能来自变量范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多