Есть ли что-то вроде 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));