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