В своем интерфейсе вы можете формально объявить переменную экземпляра между фигурными скобками, или через @property
фигурные скобки, или и то, и другое. В любом случае они становятся атрибутами класса. Разница в том, что если вы объявляете @property
, вы можете реализовать using @synthesize
, который автоматически кодирует ваш получатель / установщик. Установщик автокодера инициализирует, например, целые числа и принимает значение с плавающей запятой. ЕСЛИ вы объявляете переменную экземпляра и НЕ указываете соответствующую переменную, @property
вы не можете использовать @synthesize
и должны написать свой собственный метод получения / установки.
Вы всегда можете переопределить автокодируемый геттер / сеттер, указав свой собственный. Обычно это делается с managedObjectContext
лениво загруженным свойством. Таким образом, вы объявляете свой managedObjectContext
как свойство, но затем также пишете -(NSManagedObjectContext *)managedObjectContext
метод. Напомним, что метод, имеющий то же имя, что и переменная / свойство экземпляра, является методом «получения».
Метод @property
объявления также позволяет использовать другие параметры, такие как retain
и readonly
, которых нет в методе объявления переменной экземпляра. По сути, ivar
это старый способ, который @property
расширяет его и делает его интереснее / проще. Вы можете обратиться к любому из них, используя self. префикс или нет, это не имеет значения, если имя уникально для этого класса. В противном случае, если у вашего суперкласса то же имя свойства, что и у вас, вы должны произнести либо self.name, либо super.name, чтобы указать, о каком имени вы говорите.
Таким образом, вы увидите, что все меньше и меньше людей объявляют ivar
s между фигурными скобками, и вместо этого они будут просто указывать @property
, а затем делать @synthesize
. Вы не можете обойтись @synthesize
в своей реализации без соответствующего @property
. Синтезатор знает только, какой это тип атрибута из @property
спецификации. Оператор синтеза также позволяет вам переименовывать свойства, чтобы вы могли ссылаться на свойство по одному имени (сокращению) внутри вашего кода, но за пределами файла .h использовать полное имя. Однако с действительно крутым автозаполнением, которое теперь есть в XCode, это меньшее преимущество, но все же есть.
Надеюсь, это поможет прояснить всю путаницу и дезинформацию, которая витает вокруг.