2010-11-11 33 views
13

我正在嘗試在Obj-C中編寫一段ActiveRecord-esque代碼,並遇到以下情況:我試圖在基類中創建一個靜態類變量,該類獲取繼承類的名稱並將其轉換爲表名與多元化和一些其他格式化操作。我知道,對於一個類,人們可以沿着以下的線路做一些事情的一個實例:類方法有類似自我嗎?

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

然而,這需要一個使用self。是否有可能按照以下方式做一些事情?

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

我只是不想爲每個繼承的類對象的實例重新計算表名。我還希望有這樣的代碼可以通過ruby式元編程自動生成表名。

回答

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! 
+12

+1,雖然你可以只用'self'而不用'[self class]'。在類方法中,'self' *是'Class'。 – 2010-11-11 02:06:03

+1

@Dave,真;我一直傾向於寫'自我教學'來清楚地表明我正在尋找一門課。 – 2010-11-11 02:14:11

+0

在這種情況下,如何在foo方法中聲明一個變量,該變量可以是A或B,具體取決於哪個類調用它?類似於:typeof(self)record = [[[self class] alloc] init];?或者是一個令人滿意的做法呢? – iand675 2010-11-11 02:21:17

0

如何使用NSStringFromClass()(和NSStringFromSelector()如果需要的話)?

NSLog(@"[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(_cmd)); 
相關問題