我理解为什么当我在自己的类中定义自己的tableView属性然后使用本地变量名tableView时,我会在标题中收到警告。
我想知道的是,当我从UITableViewController派生我的类时,为什么我不会收到此警告?UITableViewController具有自己的tableView属性?编译器/编辑器只查看我的类而不是父类吗?
答案 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',它只会查找本地实例。