2010-11-11 17 views
13

Ich versuche, ein ActiveRecord-esque Bit Code in Obj-C zu schreiben, und die folgende Situation festgestellt: Ich versuche eine statische Klassenvariable in einer Basisklasse zu erstellen, die den Namen der erbenden Klasse abruft und konvertiert in Tabellenname mit Pluralisierung und einigen anderen Formatierungsoperationen. Ich weiß, dass für eine Instanz einer Klasse, die eine etwas entlang der Linien der folgenden Möglichkeiten:Gibt es etwas wie Selbst für Klassenmethoden?

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

Dies ist jedoch ein self verwenden erfordert. Ist es möglich, etwas in den folgenden Zeilen zu tun?

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

Ich würde es vorziehen, den Tabellenname für jede Instanz geerbter Klassenobjekte nicht neu zu berechnen. Ich würde es auch vorziehen, wenn dieser Codecode automatisch den Tabellennamen mit Rubin-Metaprogrammierung erzeugt.

Antwort

21

Verwenden Sie einfach [self class]! Wenn Sie eine Klassenmethode in Objective-C aufrufen, zeigt self an, welche Klasse aufruft. Zum Beispiel:

#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; 
} 

sollte

A called! 
B called! 
+12

+1, obwohl Sie einfach 'self' anstelle von' [self class] 'tun können. In einer Klassenmethode ist 'self' * * die' Klasse'. –

+1

@Dave, wahr; Ich habe es immer vorgezogen, '[self class]' zu schreiben, um klar zu machen, dass ich nach einer Klasse suche. –

+0

Wie würden Sie in diesem Szenario eine Variable in der foo-Methode deklarieren, die entweder ein A oder B sein könnte, je nachdem, welche Klasse sie aufruft? etwas wie: typeof (self) record = [[[selbstklasse] alloc] init] ;? Oder ist es eine befriedigende Art, es zu tun? – iand675

0

Wie wäre es mit NSStringFromClass() (und NSStringFromSelector() falls gewünscht) drucken?

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