Вопрос

Можно ли каким -то образом создать пользовательский @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 Чтобы бросить свой собственный макрос. Вам все равно придется написать метод самостоятельно, но вы делаете это только один раз.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top