iVars, с собой и без себя? - PullRequest
0 голосов
/ 23 июля 2010

Мне просто любопытно, какую роль я играет в объекте.Я понимаю, что запись [[self dataForTable] count] относится непосредственно к iVar, содержащемуся в этом объекте.Но если вы пропустили self и прямо указали iVar [dataTable count], как это отличается, от чего вы защищаетесь с помощью self, это просто для уникального указания iVar, а не для какой-то аналогичной локальной переменной?

высоко ценится

Гари.

Ответы [ 2 ]

1 голос
/ 23 июля 2010

Запись [[self dataForTable] count] не не относится непосредственно к iVar. Там происходит что-то закулисное ...

Если вы используете ivar в своем коде без self, это прямой доступ к ivar. Если вы используете [self someIvarName] или self.someIvarName, вы фактически отправляете сообщение объекту (который является self). Среда выполнения пытается разрешить это сообщение и будет использовать один из нескольких механизмов: если вы определили метод с совпадающим именем, этот метод будет использоваться, если такого метода (или свойства) не существует, то кодирование значения ключа по умолчанию будет использовать ivar с одинаковым именем.

Что касается воздействия, это будет зависеть от вашего кода. Например, если ваша собственность является оставленной собственностью (в отличие от назначенной), существует очень существенная разница между:

someVar = nil

и

self.someVar = nil

Синтезированный установщик должным образом выпустит someVar, прежде чем установить его в ноль, тогда как в первом примере у вас теперь утечка памяти. Это только один из примеров различий.

0 голосов
/ 23 июля 2010

[self foo] вызывает метод -foo (не iVar, метод экземпляра) на self.

self.bar использует синтаксис @property для доступа к bar iVar, вызывая методы получения / установки (-bar и -setBar:) для себя.

Обращаясь к iVar напрямую без «себя». (например, bar = @"some text") обходит геттер / сеттер. Это может быть плохой вещью, если сеттер (например) должен делать copy или retain для нового значения.

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