Номер 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 не имеет созданных аксессуаров, поэтому вы должны написать их самостоятельно. Если вы хотите, чтобы ваши методы доступа имели побочные эффекты, вы выполняете свой стандартный танец управления памятью, как показано выше, а затем выполняете любую дополнительную работу, которая вам нужна, внутри метода доступа. Если вы синтезируете свойство, а также пишете свое собственное , то ваша версия имеет приоритет.
Я все рассказал?
setFoo:
иfoo
), вы можете использовать точечную нотацию.Раньше у вас были ivars, и если вы хотели разрешить какому-то другому классу устанавливать или читать их, вам нужно было определить геттер (т.
-(NSString *)foo)
Е. И сеттер (т. Е.-(void)setFoo:(NSString *)aFoo;
).Свойства дают вам бесплатно (почти!) Сеттер и геттер вместе с ivar. Итак, когда вы определяете свойство сейчас, вы можете установить атомарность (например, хотите ли вы разрешить несколько действий настройки из нескольких потоков), а также назначить / сохранить / скопировать семантику (то есть, если установщик скопирует новое значение или просто сохраните текущее значение - это важно, если другой класс пытается установить свойство строки с изменяемой строкой, которая может быть изменена позже).
Вот что
@synthesize
делает. Многие люди оставляют имя ivar таким же, но вы можете изменить его, когда пишете оператор синтеза (т.@synthesize foo=_foo;
Е. Означает создание имени ivar_foo
для свойстваfoo
, поэтому, если вы хотите прочитать или записать это свойство, и вы не используетеself.foo
, вы будете нужно использовать_foo = ...
- это просто помогает вам поймать прямые ссылки на ivar, если вы хотите пройти только через сеттер и геттер).Начиная с Xcode 4.6, вам не нужно использовать
@synthesize
оператор - компилятор сделает это автоматически и по умолчанию добавит имя ivar с_
.источник