Есть ли что-то вроде себя для методов класса? - PullRequest
13 голосов
/ 11 ноября 2010

Я пытаюсь написать код ActiveRecord-esque в Obj-C и столкнулся со следующей ситуацией: я пытаюсь создать переменную статического класса в базовом классе, которая получает имя унаследованного класса и преобразуется в имя таблицы с множественным числом и некоторыми другими операциями форматирования. Я знаю, что для экземпляра класса можно сделать что-то вроде следующего:

tableName = [[[self class] description] stringToTableName];

Однако для этого необходимо использовать self. Можно ли что-то сделать по следующим направлениям?

tableName = [[[inheriting_class class] description] stringToTableName];

Я бы предпочел не пересчитывать имя таблицы для каждого экземпляра унаследованных объектов класса. Я также предпочел бы, чтобы этот фрагмент кода автоматически генерировал имя таблицы с помощью метапрограммирования в стиле ruby.

Ответы [ 2 ]

21 голосов
/ 11 ноября 2010

Просто используйте [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!
0 голосов
/ 11 ноября 2010

Как насчет использования NSStringFromClass () (и NSStringFromSelector () при желании)?

NSLog(@"[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
...