Это вопрос предпочтения/конвенции для некоторых. По умолчанию, выполнив:
@property (assign) NSString * myString;
... а затем:
@synthesize myString;
... даст вам три вещи. Вы получаете метод сеттера, к которому можно получить доступ как self.myString = @"newValue"
или [self setMyString:@"newValue"]
, метод getter, к которому можно получить доступ как NSString* temp = self.myString
или NSString* temp = [self myString]
, и переменную экземпляра с именем myString
, к которой можно получить доступ непосредственно внутри вашего класса (т. Е. Без прохождения через getter и setter) и используется для установки и получения значения свойства и который используется внутренне для возврата свойства.
Если вы хотите, вы можете сделать @synthesize myString = someOtherVarName
, и тогда вы все равно получите сеттер и добытчик так же, как и раньше, но вместо переменного в myString
экземпляре переменные someOtherVarName
экземпляра используются для резервного имущества, а не myString
переменных создаются.
Итак, зачем использовать более подробный синтаксис? Никогда не бывает случая, когда вы это делаете, но некоторые люди предпочитают делать это при работе со свойствами, объявленными retain
или copy
. Причиной этого является то, что установка объявленного свойства retain
или copy
с помощью его сгенерированного метода сеттера будет влиять на счет сохранения установленного/не заданного объекта. То же самое происходит при непосредственном доступе к переменной экземпляра.
Таким образом, путем наложения переменной экземпляра на что-то еще, вы можете сделать различие в коде по строкам «все, что делает xxx.myString = Y
, изменяя количество удержаний, в то время как все, что делает someOtherVarName = Y
, не является». Опять же, это не обязательно делать, но некоторые люди предпочитают это делать.
+1; Я хотел бы добавить, что '@ synhesize' будет просто _complete_ классом с ivar, getter и setter: если вы сами определите их, они будут иметь преимущество перед автоматической реализацией. – zneak