Есть ли что-то вроде self для методов класса?
Я пытаюсь написать бит кода ActiveRecord-esque в Obj-C и столкнулся со следующей ситуацией: я пытаюсь создать переменную статического класса в базовом классе, которая получает имя наследуемого класса и преобразует в имя таблицы с плюрализацией и некоторые другие операции форматирования. Я знаю, что для экземпляра класса, который можно сделать что-то в следующих строках:
tableName = [[[self class] description] stringToTableName];
Однако для этого требуется использовать self
. Можно ли что-то делать по следующим строкам?
tableName = [[[inheriting_class class] description] stringToTableName];
Я бы предпочел не пересчитывать имя таблицы для каждого экземпляра унаследованных объектов класса. Я также предпочел бы, чтобы этот бит кода автоматически генерировал имя таблицы с метапрограммированием в стиле ruby.
Ответы
Ответ 1
Просто используйте [self class]
! Когда вы вызываете метод класса в Objective-C, self
укажет, какой класс вызывает. Например:
#import <Foundation/Foundation.h>
#import <stdio.h>
@interface A: NSObject
+ (void)foo;
@end
@implementation A
+ (void)foo {
printf("%s called!", [[[self class] description] UTF8String]);
}
@end
@interface B: A @end
@implementation B @end
int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[A foo];
[B foo];
[pool release];
return 0;
}
должен печатать
A called!
B called!
Ответ 2
Как насчет использования NSStringFromClass() (и NSStringFromSelector() при желании)?
NSLog(@"[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd));