Цель C Препроцессор: получение текущего класса - PullRequest
5 голосов
/ 23 апреля 2011

Есть ли способ получить класс текущей области видимости в препроцессоре?

В настоящее время я делаю следующее:

У меня есть макрос:

#define DATA_SOURCE_DEF_CONSTR(CLASS) + (CLASS *)dataSource { \
CLASS *source = [[[CLASS alloc] init] autorelease]; \
return source; \
}

и затем я использую этот макрос во многих классах, таких как:

DATA_SOURCE_DEF_CONSTR(SpecialDataSource)

Я бы хотел что-то вроде:

#define DATA_SOURCE_DEF_CONSTR + (__CLASS__ *)dataSource { \
__CLASS__ *source = [[[__CLASS__ alloc] init] autorelease]; \
return source; \
}

И назовите это как:

@implementation ...

DATA_SOURCE_DEF_CONSTR

...

@end

Возможно ли это в Objective-C с препроцессором?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2011

Я не понимаю, чего вы пытаетесь достичь. Почему бы просто не добавить категорию в NSObject, например:

@implementation NSObject (handyConstructor)

+ autoreleasedInstance { return [[[self class] alloc] init] autorelease]; }

@end

Есть ли какая-то причина, по которой вы хотите, чтобы это делал, в частности, препроцессор?

1 голос
/ 24 января 2014

Есть новое ключевое слово, instancetype, которое, возможно, могло бы вам помочь; больше здесь . Для вашего примера:

#define DATA_SOURCE_DEF_CONSTR + (instancetype)dataSource { \
return [[[[self class] alloc] init] autorelease]; \
}
...