Месяц назад я читал об этом. Я не уверен, но я думаю, что если я вызову self.myInstanceVariable, то он автоматически использует getter / setters, но если я, например, вызову напрямую myInstanceVariable = @ "Foo", то я бы обошел любой getter / setter, действительно, очень плохо. Правильно / неправильно?
РЕДАКТИРОВАТЬ: я пробовал это в XCode.
Реализация выглядит так:
@implementation Test
@synthesize name;
+ (Test*)testWithName:(NSString*)name {
Test* test = [self alloc];
test.name = name;
return [test autorelease];
}
- (void)setName:(NSString*)newName {
NSLog(@"SETTER CALLED!!");
if(name != newName) {
[name release];
name = [newName retain];
}
}
- (NSString*)name {
NSLog(@"GETTER CALLED!!");
return name;
}
- (void)doWrongThing {
NSString *x = name;
NSLog(@"doWrongThing: %@", x);
}
- (void)doRightThing {
NSString *x = self.name;
NSLog(@"doRightThing: %@", x);
}
Тестовый код выглядит так:
Test *t = [Test testWithName:@"Swanzus Longus"];
//NSLog(@"%@", t.name);
[t doWrongThing];
[t doWrongThing];
[t doWrongThing];
[t doRightThing];
Итак, после запуска этого кода в другом методе (я только что использовал существующий проект;)), я получил такой вывод в консоли:
2009-05-01 19:00:13.435 Demo[5909:20b] SETTER CALLED!!
2009-05-01 20:19:37.948 Demo[6167:20b] doWrongThing: Swanzus Longus
2009-05-01 20:19:37.949 Demo[6167:20b] doWrongThing: Swanzus Longus
2009-05-01 20:19:37.949 Demo[6167:20b] doWrongThing: Swanzus Longus
2009-05-01 20:19:37.950 Demo[6167:20b] GETTER CALLED!!
2009-05-01 20:19:37.965 Demo[6167:20b] doRightThing: Swanzus Longus
Как вы видите, вы ДОЛЖНЫ использовать self.instanceVariableName, чтобы использовать методы получения и установки (или вы делаете вызов в скобках, тоже работает).
Предупреждение о путанице: вы должны использовать self только в том случае, если вы взломали метод объекта, из которого вы хотите получить доступ к переменной экземпляра. Снаружи, когда вы вызываете someObjectPointer.someInstanceVariable, он автоматически получает доступ к получателям и установщикам (да, я тоже это пробовал).
Просто подумал, что кому-то будет интересно небольшое тематическое исследование;)