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
на новое значение.