2010-06-26 15 views
6

Ich habe 2 Klassen, Parent und Child, und Parent hat eine Klassenmethode namens func. Nun möchte ich Klasseninstanz in func-Methode zu unterscheiden, welche Klasse Anrufer ist.Objective-c: Wie bekomme ich Klasseninstanz in Klassenmethode

@interface Parent : NSObject 
+ (void)func; 
@end 

@implementation Parent 

+ (void)func { 
    Class *class = howToGetClass(); 
    NSLog(@"%@ call func", class); 
} 

@end 

@interface Child : Parent 
@end 

int main() { 
    [Child func]; // call func from Child 
} 

Gibt es eine Möglichkeit, Klasseninstanz (oder Klassenname) in der Klassenmethode zu erhalten?

Antwort

16

Wenn Sie es einfach anmelden wollen/es als Klasse zu erhalten, müssen Sie nur self. Das ist es. So wie

+ (void)func { 
    Class class = self; 
    NSLog(@"%@ call func", class); 
} 

oder

+ (void)func { 
    NSLog(@"%@ call func", self); 
} 

auch, wenn Sie den Namen als NSString, NSStringFromClass (Selbst-) bekommen hat Sie bedeckt. (Als char *, class_getName (self) ist, was Sie suchen)

+0

Ich versuche einige Hilfsmethoden (wie all() in django) zu NSManagedObject hinzuzufügen. Also muss ich den Anrufer unterscheiden. Mit 'selbst' wollte ich wissen! Vielen Dank! – taichino

+0

Es war nicht ich, wer unten gewählt, aber ich überprüfte einfach, und in einer Klassenmethode self == [self class] Just sah, dass dies in einem anderen Kommentar gesagt worden war, aber um zu klären, sie sind IDENTISCH, zumindest in einer Klassenmethode. Sie hatten also Recht, und so war ich –

+1

Class * class = self; ist falsch. Löschen *. Korrekte Syntax ist: Class class = self; – Lukasz

3

Um den aktuellen Klassenobjekt zu erhalten, sollten Sie in der Lage zu tun:

[self class]; 

Als selbst die Klasseninstanz beziehen, weil es sich um eine Klassenmethode ist. Class ist eine in NSObject definierte Methode, die die Klasse für das Objekt zurückgibt.

Edited Verwirrung zu vermeiden ...

+0

Um dies zu verdeutlichen, gibt dies das 'Class' Objekt Ihrer Klasse zurück, nicht nur den * Namen *, wie durch die Antwort impliziert. –

+3

tatsächlich, [Selbstklasse] ist das selbe wie Selbst in einer Klassenmethode. Die Dokumente (okay, die GNUStep-Dokumente) sagen tatsächlich, dass sie nur mit 'return self;' implementiert werden. Es existiert nur für das Übergeben von Klassen als Argumente, siehe http://stackoverflow.com/questions/3107213/why-do-we-have-to-do-myclass-class-in-objective-c –

+1

Vielen Dank! Ich wusste nicht, dass "Selbst" in der Klassenmethode verwendet werden kann! – taichino

Verwandte Themen