Что делают @synthesize
и @property
в Xcode? Просьба представить объяснение на очень простых условиях?
@property @synthesize
Ответ 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)