Цель C - Custom @Synthesize?
-
27-10-2019 - |
Вопрос
Можно ли каким -то образом создать пользовательский @synthesize, чтобы генерировать gateme getter, setters ??
Например:
@interface
@property (nonatomic, retain) MyObject *object;
@end
@implementation
@lazyInitialize object;
@end
А потом каким -то образом определите @lazyinitialize, чтобы генерировать метод ленивого инициализатора
//@lazyInitialize
- (id)"property name"
{
if (!"property name")
{
"property name" = [[["property name" class] alloc] init];
}
return "property name";
}
Решение
Вы можете попробовать что -то другое, хотя. Я бы не подумал об этом более пары дней назад, но я случайно читал Какао с любовью. Анкет В связанном посте он обсудил, как он сделал #define
Макро, который «генерирует» весь класс для синглтона, где бы вы ни называли макрос. Вы можете Загрузите его код Для этого (может дать идеи о вашей собственной реализации).
Возможно, что -то вроде (ПРЕДУПРЕЖДЕНИЕ: НЕОБХОДИМОЙ КОДЕР):
#define SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(objectName, objectType) \
\
- (objectType *)objectName \
{ \
if(!objectName) \
{ \
objectName = [[objectType alloc] init]; \
} \
return objectName; \
} \
\
- (void)set##objectName:(objectType *)value \
{ \
[value retain]; \
[objectName release]; \
objectName = value; \
}
должно сработать? Я прошу прощения, что у меня нет времени, чтобы правильно проверить его для вас, поэтому воспринимайте это как справедливое предупреждение, что это не быстрое копирование/вставское решение. Прости за это. Надеюсь, это все еще полезно! ;)
Пример использования
Это должно работать снова ПРЕДУПРЕЖДЕНИЕ: НЕОБХОДИМОЙ КОДЕР:
Заголовок
// ....
@interface SomeClass : NSObject {
NSObject *someObj;
}
@end
Реализация
@implementation SomeClass
// ....
SYNTHESIZE_LAZY_INITIALIZER_FOR_OBJECT(someObj, NSObject);
// ....
@end
Другие советы
@synthesize
В Objective-C работает аналогичным образом с автоматическим синтаксисом свойств в C#, в том, что оба генерируют минимальный требуемый синтаксис для создания/сетевых сеттеров свойств. На обоих языках, если вы хотите пользовательскую функциональность, вам нужно реализовать их вручную.
мне действительно нравится Ответ Райана Версала Использования #define
Чтобы бросить свой собственный макрос. Вам все равно придется написать метод самостоятельно, но вы делаете это только один раз.