tableView的本地声明隐藏了实例变量?

时间:2011-01-01 05:49:31

标签: objective-c

我理解为什么当我在自己的类中定义自己的tableView属性然后使用本地变量名tableView时,我会在标题中收到警告。

我想知道的是,当我从UITableViewController派生我的类时,为什么我不会收到此警告?UITableViewController具有自己的tableView属性?编译器/编辑器只查看我的类而不是父类吗?

3 个答案:

答案 0 :(得分:23)

当您实现方法时,参数/局部变量与实例变量共享相同的命名空间。但是,它们不会与声明的属性共享相同的名称空间,这意味着类可以声明一个名为someData的属性(或从其一个超类继承它),具有带有其他名称的支持实例变量,并且该类的方法的实现也可以有一个名为someData的参数/局部变量 - 在这种情况下编译器不会发出警告。

我假设你有一个名为tableView的声明属性,还有一个名为tableView的实例变量,后者要么在接口中显式声明,要么在合成属性时自动创建。在这种情况下,如果您定义一个采用名为tableView的参数或声明名为tableView的局部变量的方法,则此本地声明将隐藏名为{{1的实例变量 (但不是属性)。

tableView的情况下,没有名为UITableViewController的实例变量。有一个名为tableView的声明属性,因为它位于不同的命名空间中,所以不会被本地(变量)声明隐藏。

避免编译器警告的一个简单方法是为实例变量指定一个不同的名称。例如,实例变量可以命名为tableView,属性仍然可以命名为_tableView,但合成为tableView

答案 1 :(得分:0)

发布生成警告的确切代码。

“本地声明”通常意味着你有类似的东西:

- (void) foo {
    int thisIsTheNameOfAnInstanceVariable;
}

但是,可能会有其他排列方式导致这种情况发生。

答案 2 :(得分:-1)

我不确定我是否正确地回答了这个问题,但是如果你想要访问超类中的变量(例如UITableView,因为你的类正在派生它),你必须使用“self”。然后变量名称形成超类。无论何时直接调用变量,例如'myVariable',它只会查找本地实例。