Цель C - Custom @synthesize? - PullRequest
       48

Цель C - Custom @synthesize?

3 голосов
/ 01 мая 2011

Можно ли как-то создать пользовательский @synthesize для генерации обычного геттера, сеттеров ??

Например:

@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";
}

Ответы [ 2 ]

5 голосов
/ 01 мая 2011

Вы можете попробовать что-то другое, хотя.Я бы не подумал об этом больше, чем пару дней назад, но я случайно прочитал Какао с любовью .В связанном посте он обсуждал, как он создал макрос #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
2 голосов
/ 01 мая 2011

@synthesize в Objective-C работает аналогично автоматическому синтаксису свойств в C #, в котором оба генерируют минимально необходимый синтаксис для создания методов получения / установки свойств. На обоих языках, если вам нужны пользовательские функции, вам нужно реализовать их вручную.

Мне действительно нравится ответ Райана Версала об использовании #define для прокрутки собственного макроса. Вам все равно придется писать метод самостоятельно, но вы делаете это только один раз.

...