Подтвердить что ты не робот

Цель синтеза

Я использую книгу iOS5 для изучения программирования iOS.

@synthesize coolWord;

^ synthesize используется для всех свойств в .m файлах

Я слышал, что в iOS6 нет необходимости в синтезе, поскольку он автоматически выполняется для вас. Это правда?

Использует ли синтез какую-либо роль для iOS6?

Спасибо за разъяснение.:)

4b9b3361

Ответ 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, будет добавляться автоматически во время компиляции.