Локальное объявление tableView скрывает переменную экземпляра? - PullRequest
4 голосов
/ 01 января 2011

Я понимаю, почему я получаю предупреждение в заголовке, когда я определяю свое собственное свойство tableView в своем собственном классе, а затем использую имя локальной переменной tableView.

То, что я хочу знать, - почему я не получаю это предупреждение, когда извлекаю свой класс из UITableViewController, который имеет свое собственное свойство tableView? Компилятор / редактор смотрит только на мой класс, а не на родительский класс?

Ответы [ 3 ]

23 голосов
/ 01 января 2011

При реализации метода параметры / локальные переменные совместно используют то же пространство имен, что и переменные экземпляра.Однако они не используют то же пространство имен, что и объявленные свойства, что означает, что класс может объявить свойство с именем someData (или унаследовать его от одного из его суперклассов), иметь переменную резервного копирования с некоторым другим именем, иРеализация метода этого класса также может иметь параметр / локальную переменную с именем someData - компилятор не выдаст предупреждение в этом случае.

Я предполагаю, что у вас есть объявленное свойство с именем tableView итакже переменная экземпляра с именем tableView, последняя либо явно объявлена ​​в интерфейсе, либо автоматически создана при синтезировании свойства.В этом случае, если вы определяете метод, который принимает параметр с именем tableView или объявляет локальную переменную с именем tableView, это локальное объявление будет скрывать переменную экземпляра с именем tableView (но не свойство).

В случае UITableViewController переменная экземпляра с именем tableView отсутствует.Существует объявленное свойство с именем tableView, которое, поскольку оно находится в другом пространстве имен, не будет скрыто локальной (переменной) декларацией.

Одним из простых способов избежать предупреждений компилятора является предоставление другогоимя переменной экземпляра.Например, переменная экземпляра может быть названа _tableView, а свойство все равно будет именоваться tableView, но синтезировано как @synthesize tableView = _tableView.

0 голосов
/ 01 января 2011

Разместите точный код, который генерирует предупреждение.

«Локальная декларация» обычно подразумевает, что у вас есть что-то вроде:

- (void) foo {
    int thisIsTheNameOfAnInstanceVariable;
}

Вероятно, существуют и другие перестановки, с помощью которых вы могли бы вызвать это.

0 голосов
/ 01 января 2011

Я не совсем уверен, правильно ли я отвечаю на этот вопрос, но если вы хотите получить доступ к переменным в суперклассах (например, UITableView, поскольку ваш класс извлекает их из него), вы должны использовать «self». тогда имя переменной образует суперкласс. Всякий раз, когда вы вызываете переменные напрямую, например, 'myVariable', он будет искать только локальные экземпляры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...