Номер 1 отличается от двух других тем, что объявляет класс MyOtherObject вперед, чтобы минимизировать объем кода, видимого компилятором и компоновщиком, а также потенциально избежать циклических ссылок. Если вы сделаете это таким образом, не забудьте поместить #import в файл .m.
Объявляя @property (и сопоставляя @synthesize в .m) файле, вы автоматически создаете методы доступа с семантикой памяти, обрабатываемой так, как вы указываете. Практическое правило для большинства объектов - «Сохранить», но, например, для NSStrings следует использовать «Копировать». В то время как синглтоны и делегаты обычно должны использовать Assign. Инструменты для рукописного ввода утомительны и подвержены ошибкам, поэтому они избавляют от множества ошибок при вводе текста и лишних ошибок.
Кроме того, объявление синтезированного свойства позволяет вызывать метод доступа, используя точечную нотацию, например:
self.otherObj = someOtherNewObject;
MyOtherObject *thingee = self.otherObj;
Вместо обычного способа передачи сообщений:
[self setOtherObject:someOtherNewObject];
MyOtherObject *thingee = [self otherObj];
За кулисами вы действительно вызываете метод, который выглядит так:
- (void) setOtherObj:(MyOtherObject *)anOtherObject {
if (otherObject == anOtherObject) {
return;
}
MyOtherObject *oldOtherObject = otherObject;
otherObject = [anOtherObject retain];
[oldOtherObject release];
}
…или это
- (MyOtherObject *) otherObject {
return otherObject;
}
Тотальная боль в заднице, верно. Теперь сделайте это для каждого ивара в классе. Если вы сделаете это неправильно, вы получите утечку памяти. Лучше просто позволить компилятору делать всю работу.
Я вижу, что номер 1 не имеет ивара. Предполагая, что это не опечатка, это нормально, потому что директивы @property / @synthesize также объявят ivar за вас, за кулисами. Я считаю, что это новинка для Mac OS X - Snow Leopard и iOS4.
Номер 3 не имеет созданных аксессуаров, поэтому вы должны написать их самостоятельно. Если вы хотите, чтобы ваши методы доступа имели побочные эффекты, вы выполняете свой стандартный танец управления памятью, как показано выше, а затем выполняете любую дополнительную работу, которая вам нужна, внутри метода доступа. Если вы синтезируете свойство, а также пишете свое собственное , то ваша версия имеет приоритет.
Я все рассказал?