Цель синтеза
Я использую книгу iOS5 для изучения программирования iOS.
@synthesize coolWord;
^ synthesize используется для всех свойств в .m файлах
Я слышал, что в iOS6 нет необходимости в синтезе, поскольку он автоматически выполняется для вас. Это правда?
Использует ли синтез какую-либо роль для iOS6?
Спасибо за разъяснение.:)
Ответы
Ответ 1
@synthesize в objective-c просто реализует средства настройки свойств и getters:
- (void)setCoolWord:(NSString *)coolWord {
_coolWord = coolWord;
}
- (NSString *)coolWord {
return _coolWord;
}
В Xcode 4 верно, что это реализовано для вас (для iOS6 требуется Xcode 4). Технически он реализует @synthesize coolWord = _coolWord
(_coolWord
- это переменная экземпляра, а coolWord
- это свойство).
Для доступа к этим свойствам используйте self.coolWord
как для установки self.coolWord = @"YEAH!";
, так и для получения NSLog(@"%@", self.coolWord);
Также обратите внимание: как установщик, так и геттер все еще могут быть реализованы вручную. Если вы внедряете BOTH setter и getter, хотя вам также нужно включить вручную @synthesize coolWord = _coolWord;
(не знаю, почему это так).
Ответ 2
Автосинтез в iOS6 по-прежнему требует @synthesize
- для создания методов доступа для свойств, определенных в
@protocol
.
- чтобы сгенерировать опорную переменную, когда вы включили свои собственные аксессоры.
Второй случай можно проверить следующим образом:
#import <Foundation/Foundation.h>
@interface User : NSObject
@property (nonatomic, assign) NSInteger edad;
@end
@implementation User
@end
Введите clang -rewrite-objc main.m
и убедитесь, что переменная сгенерирована. Теперь добавьте аксессоров:
@implementation User
-(void)setEdad:(NSInteger)nuevaEdad {}
-(NSInteger)edad { return 0;}
@end
Введите clang -rewrite-objc main.m
и убедитесь, что переменная НЕ сгенерирована. Поэтому для того, чтобы использовать переменную backing от аксессуаров, вам нужно включить @synthesize
.
Он может быть связан с этим:
Clang обеспечивает поддержку автосинтеза объявленных свойств. С помощью эта функция, clang обеспечивает синтез по умолчанию этих свойств, а не объявлен @dynamic и не предоставлен пользователю для поддержки getter и методы сеттера.
Ответ 3
Я не уверен, как @synthesize
относится к iOS6, но с Xcode 4.0 он по существу устарел. В принципе, вам это не нужно! Просто используйте объявление @property
и за кулисами, компилятор генерирует его для вас.
Вот пример:
@property (strong, nonatomic) NSString *name;
/*Code generated in background, doesn't actually appear in your application*/
@synthesize name = _name;
- (NSString*)name
{
return _name;
}
- (void) setName:(NSString*)name
{
_name = name;
}
Весь этот код позаботится о том, чтобы вам понравилось. Поэтому, если у вас есть приложения с @synthesize
, пришло время сделать некоторую очистку.
Вы можете просмотреть мой аналогичный вопрос здесь, который может помочь уточнить.
Ответ 4
Я считаю, что директивы @synthesize
автоматически вставляются в последний компилятор Obj-C (тот, который поставляется с iOS 6).
Точка @synthesize pre-iOS 6 - автоматически создавать геттеры и сеттеры для переменных экземпляра, чтобы генерировались [classInstance getCoolWord]
и [classInstance setCoolWord:(NSString *)aCoolWord]
. Поскольку они объявлены с помощью @property
, вы также получаете удобство синтаксиса точки для getter и setter.
Ответ 5
hope this will help little more
yes previously we have to synthesis the property by using @synthesis now it done by IDE itself.
но мы можем использовать его как
//то, что IDE делает внутри
@synthesis name=_name;
мы используем _name для доступа к определенному свойству, но теперь вы хотите синтезировать каким-то другим способом, например
firstname вы можете сделать это как
@synthesis name= firstname
или просто по имени
@synthesis name=name
Ответ 6
С автоматическим синтезом в iOS6 больше не нужно специально объявлять поддержку иваров или писать оператор @synthesize. Когда компилятор найдет оператор @property, он будет делать как от нашего имени, используя только что рассмотренные рекомендации. Итак, все, что нам нужно сделать, это объявить свойство, подобное этому:
@property (nonatomic, strong) NSString *abc;
и в iOS 6, @synthesize abc = _abc, будет добавляться автоматически во время компиляции.