2014-02-11 28 views
0

我是新手,我似乎在這方面得到了多個錯誤。 我只需要一個for或while循環來打印出某個Class的所有超類。找到Objective-C中所有類的超類的正確方法?

這裏是我想要的僞代碼:

IDontKnowWhatClass *superClassName; 

while (superClassName != nil) 
{ 
    superClassName = [[superClassName class] superclass]; 
    NSLog(print the name); 
} 

回答

1

試試這個

Class superClassName = [self class]; 

while (superClassName != nil) 
{ 
     superClassName = [superClassName superclass]; 
     NSLog(@"%@",NSStringFromClass(superClassName)); 
} 

如果你知道一個類本身一樣NSString然後,

Class superClassName = [NSString class]; 

您可以在類名保存爲一個字符串像

NSString *className = NSStringFromClass(superClassName); 

如果你想創建從類名稱存儲在一個字符串像

id object = [[NSClassFromString(className) alloc] init]; 
+0

這是非常好的...它開箱即用。希望我能給它兩個upvotes,這樣我就可以將它與其他所有我只給予1 upvote的分開。這與我在問題 – unmircea

+0

中發佈的內容非常接近。似乎要求初始化對象的超類是要走的路。任何能夠在運行時執行此操作的方法都能夠將普通的NSString作爲類的實際名稱並在運行時執行此操作,因此我可以鍵入我想要的類的名稱,例如文本字段並讓系統詢問Class用這個名字的消息超類,並進入while循環。您能否編輯您的答案以包含完整的代碼示例,以便我可以將其標記爲答案。 – unmircea

+0

'superClassName'不是一個名字。您應該重命名該變量。 –

1

使用NSObject的方法名稱爲:

objc_property_t class_getProperty(Class cls, const char *name) 

//Returns a property with a given name of a given class. 

繼續尋找,直到你得到NSObject的,因爲它是supermost類

使用此方法檢查相等性:

- (BOOL)isEqual:(id)object; 

[object isKindOfClass:[SomeClass class]] 

Documentation here

這將工作

+1

這似乎是正確的,但是waaaay我上面的聯賽中類的對象。你所得到的只是一個投票:)...在進入Objective-C運行時之前,我有很多理由要報道。 – unmircea

+1

試過所有的答案,看起來你比我以前認爲的更接近真相。正確的代碼應該能夠將正常的NSString作爲類的實際名稱進行轉換,並在運行時執行此操作,以便我可以在文本字段中鍵入所需類的名稱,並讓系統向該類請求消息超類,並進入while循環。您能否編輯您的答案以包含完整的代碼示例,以便我可以將其標記爲答案。 – unmircea

+0

告訴我你想要什麼課程? –

1

您可以在當前類調用superclass方法,直到它變得等於零(這會發生的根類,即NSObject)。

Class c = [IDontKnowWhatClass class]; 

while (c) 
{ 
    NSLog(@"%@", NSStringFromClass(c)); 
    c = [c superclass]; 
} 
+0

聽。我剛剛運行你的代碼,它永遠不會進入while循環。當我調試「C」似乎有一個值,但它只是跳過while循環,從不打印任何東西。 – unmircea

+0

如果全部執行,似乎「c」的值只是「class」而不是「classname」是 Class c = [self class]; (c) NSLog(@「%@」,NSStringFromClass(c)); c = [c superclass]; }那麼一切都很好......它似乎* superClassName需要正確初始化的代碼工作。 – unmircea

+0

我修好了。看起來第一行創建* superClassName對象,但它不初始化它。正確的代碼應該能夠將正常的NSString作爲類的實際名稱並在運行時執行此操作。因此,我可以輸入我想要的類的名稱,例如文本字段,然後讓系統向該類名稱詢問消息超類,然後進入while循環。 – unmircea

1
NSString* classString = @"IDontKnowWhatClass"; 
Class class = NSClassFromString(classString); 
while (class != nil){ 
    NSLog(@"%@", [class description]); 
    class = [class superclass]; 
} 
+0

這是正確的。你會得到一個贊成,但我不能選擇它作爲我的答案,因爲它重定向到一個滾動視圖,我不知道它是什麼。我會閱讀有關它。 – unmircea

+0

似乎要求初始化對象的超類是要走的路。任何能夠在運行時執行此操作的方法都能夠將普通的NSString作爲類的實際名稱並在運行時執行此操作,因此我可以鍵入我想要的類的名稱,例如文本字段並讓系統詢問Class用這個名字的消息超類,並進入while循環。您能否編輯您的答案以包含完整的代碼示例,以便我可以將其標記爲答案。 – unmircea

+0

@unmircea,有NSClassFromString函數從字符串中獲取類對象(如果存在) – Vladimir