@property @synthesize

Что делают @synthesize и @property в Xcode? Просьба представить объяснение на очень простых условиях?

Ответ 1

Вы запросили простые условия:

@property объявляет свойство в вашем заголовок класса

@property (nonatomic, retain) NSString *myString;

@synthesize создает ваш сеттер и getter для вашей собственности (accessor методы)

Без синтеза вы должны написать ваш собственный сеттер и геттер реализация, например getMyString или setMyString (запишите первый характер вашей собственности)

Сэм: Просто совет: http://www.cocoadevcentral.com/d/learn_objectivec/ - довольно солидный ресурс, чтобы узнать об основах, подобных свойствам.

Удачи!

Ответ 2

Свойства и синтезированные аксессоры - это новые функции в Objective-C 2.0.

Когда вы объявляете @property, вы несколько объявляете экземпляр var. Затем вы @synthesize методы доступа (т.е. Getter и setter) для этого свойства.

Есть также @dynamic accessors, если вам интересно.

На этом вы должны сделать домашнее задание. Apple имеет отличный pdf для этого.

Ответ 3

Подумайте о магии objective-c как о простом "умном макросе", например "более умном постулате #define",   @property, если вы заметили, всегда находится в файле h,   @synthesize всегда находится в файле m. Так на заднем плане   @property (что угодно) NSString * myString;

становится объявлением двух методов и частной переменной;

void set_myString:(NSString *) str;
(NSString*) get_myString;

объявления в файле заголовка

чтобы заставить их делать что-то, их реализация добавляется в файл m при вводе   @synthesize myString; который становится чем-то вроде   void set_myString: (NSString *) str   {     myString = str;   }

(NSString *) get_myString
{
  return (myString);
}

Но это умнее, чем это в зависимости от того, хотите ли вы сказать "сохранить" "сильный" или "слабый", он либо просто вернет указатель на myString, либо скопирует myString в новый объект

Итак, все это делается автоматически компилятором, просто прочитав ваши объявления. Что весьма полезно и экономит много времени

Ответ 4

По умолчанию все наши переменные являются Private, поэтому мы не можем выйти из класса. если мы хотим использовать нашу переменную экземпляра вне класса. Когда вы объявляете @property, вы несколько объявляете экземпляр var. Затем вы @synthesize методы доступа (т.е. Getter и setter) для этого свойства.

Есть также @dynamic accessors, если вам интересно.

Ответ 5

он просто устанавливает имя переменной setter в свой собственный класс. Например, скажем, у меня есть это: @property (nonatomic, copy) NSArray* viewControllers;

Ну, если я хочу получить доступ к setter _viewController, я бы не установил переменную синтезатора. но если я хочу получить доступ к переменной viewController именем viewController вместо _viewController, я бы сделал @synthesize viewController;.

Если бы я хотел использовать его как совершенно другое имя, я мог бы сделать это @synthesize viewControllers = viewControlololer;, но это только setter. Как вы заметили, [self viewControllers] работает только, а не [self viewControlololer];

Поэтому я не понимаю, почему каждый пишет устанавливает "сеттер и геттер" свойства. Он вообще не изменяет переменную геттера... если это означает, что [self viewController] знает viewControlololer (очевидно).

Ответ 6

На самом деле свойства синтезируются, как неявно, так и явно. Свойства неявно синтезируются. Поэтому нет необходимости использовать синтезированный, если вы не захотите изменить имя переменной на нечто, отличное от _property_name.

Существуют и другие варианты использования, например, если вы не хотите, чтобы переменная экземпляра возвращала ваше свойство.

Свойства явно синтезируются с помощью директивы @synthesized.

(Ответ извлечен из руководства Big Nerd Ranch)