类方法有自己的东西吗?

时间:2010-11-11 01:00:54

标签: objective-c metaprogramming

我正在尝试在Obj-C中编写一个ActiveRecord-esque位代码,并遇到以下情况:我正在尝试在基类中创建一个静态类变量,该类获取继承类的名称并转换为表名具有复数和一些其他格式化操作。我知道,对于一个类的实例,人们可以按照以下方式执行某些操作:

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

但是,这需要使用self。是否有可能沿着以下几点做点什么?

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

我只是不想为每个继承的类对象实例重新计算表名。我也希望让这段代码用ruby风格的元编程自动生成表名。

2 个答案:

答案 0 :(得分:21)

只需使用[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!

答案 1 :(得分:0)

如果需要,使用NSStringFromClass()(和NSStringFromSelector())怎么样?

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