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