2010-06-08 6 views
3

Скажем, у меня есть следующие заголовки:OBJ-C - Получение имени класса из иерархии классов

@interface SuperClass : NSObject 

@interface SubClass : SuperClass 

Я alloc'ing экземпляр класса, выполнив:

SubClass *sc = [[SubClass alloc] init]; 

В моем SuperClass.m:

- (id) init 
{ 
self = [super init]; 
if (self != nil) 
{ 
    NSString *cString = NSStringFromClass([self class]); 
} 
return self; 
} 

Простой, не так ли? Мой вопрос: как я могу заставить cString вернуть класс SuperClass, а не класс SubClass? Поскольку SubClass является alloc'd/init'd, это невозможно?

Спасибо!

+0

Существует множество способов сделать это, причем простейшим из предложений Карла является то, что если вы всегда хотите одну и ту же строку, просто используйте статическую строку. Если есть какая-то более глубокая проблема, которую вы хотите решить здесь, возможно, было бы хорошо, если мы будем в ней участвовать, чтобы мы могли предложить лучшие предложения о том, как это сделать. – Chuck

+1

Согласитесь с Чак. Я не могу придумать причину, по которой вам когда-либо понадобилось знать имя суперкласса. Возможно, есть лучший способ сделать то, что вы хотите. – JeremyP

ответ

0

Если вы хотите всегда ту же строку, чтобы выйти, почему не просто:

NSString *classString = @"SuperClass"; 
+0

Я могу в конечном итоге прибегнуть к этому, но SubClass может быть дополнительно подклассифицирован (то есть SubSubClass). Если возможно, я бы предпочел, чтобы у каждого подкласса не было жесткого кода, если я могу использовать '[self class]' для каждого суперкласса. – mmilo

5

Если вы всегда хотите, чтобы получить супер-класс,

- (id) init 
{ 
    self = [super init]; 
    if (self) 
    { 
     NSString *cString = NSStringFromClass([self superclass]); 
    } 
    return self; 
} 

Если вы alloc + init подкласса , то cString будет содержать “ SuperClass ”, но если вы alloc + init a SuperClass, то cString будет содержать “ NSObject ”.

Смежные вопросы