iVars, с собой и без себя?

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

@implementation ViewController
@synthesize dataForTable;

...

NSUInteger dataCount = [[self dataForTable] count];

очень признателен

Гэри.

2 ответа

Решение

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

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

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

someVar = nil

а также

self.someVar = nil

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

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

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

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

Другие вопросы по тегам