2011-07-15 89 views
3

我有一個我正在測試的類,它使用大量的運行時類型標識(反射)來做出關於如何行爲的決定。NSClassFromString返回一個Class對象,它不會正確響應isSubClassOfClass

具體來說,我得到Class給定類型使用property_getAttributes和一個小字符串魔術。

說解析的類是MyInheritedObject。然後我需要檢查這個類是否繼承了一個公共基類MyBaseObject

因此,考慮字符串: 「MyInheritedObject」,我用NSClassFromString得到一個類的實例,就像這樣:

NSString *className = @"MyInheritedObject"; 
Class cls = NSClassFromString(className); 
BOOL isSubclass = [cls isSubclassOfClass:[MyBaseObject class]]; 

這將返回NO,這是令人難以置信的令人費解。如果我雖然退出超類,它看起來像它應該工作:

NSLog(@"Superclass: %@", [cls superclass]); 
//logs: Superclass: MyInheritedObject 

所以對我使用的字符串比較,繼續與我工作的時間感,但它是一個可怕的hackety-黑客,我不能這樣離開它。

不確定它是否相關,但是這是從測試目標發生的,所以有問題的類將被添加到兩個目標中。

關於這裏發生了什麼的任何想法?

+0

您可以爲每個類添加主@interface的第一行,以便我可以在代碼中看到類層次結構? –

+0

假設MyInherited對象從繼承自NSObject的MyBaseObject繼承而來 –

回答

2
NSString *className = @"MyInheritedObject"; 
Class indirectClass = NSClassFromString(className); 
Class directClass = [MyInheritedObject class]; 
BOOL isSubclass = [indirectClass isSubclassOfClass:directClass]; 

如果你這樣做,(indirectClass == directClass)

+0

嘗試了這一點,它們不相等。 (兩種情況)。 –

+0

這很奇怪(但讓我感覺更好,'[A isSubclassOf:A]'沒有失敗)。 – bshirley

+0

實際的Class名稱究竟是什麼? – hooleyhoop

0

我只能假設你的類層次結構是錯誤的。使用上面的完全相同的代碼,我得到了你所期望的。您是否嘗試了以下操作:

NSLog(@"%@ %@", NSClassFromString(@"MyInheritedObject"), [MyInheritedObject class]); 

查看輸出是否匹配。你發佈的代碼很好,所以它必須是MyInheritedObject或MyBaseObject的問題。我會仔細檢查你的類層次結構,並且確保你使用你的類名的前綴,只是在關閉的機會,他們的命名衝突(雖然運行時間應在控制檯提醒你的是)

+0

是的,我已經完成了這個和輸出是相同的。 –

0

我有類似的問題,其中(從NSClassFromString獲得)上類型的測試:

[type isSubclassOfClass:[AKABindingProvider class]] 

失敗,並且該測試

[type isSubclassOfClass:NSClassFromString(NSStringFromClass([AKABindingProvider class]))] 

成功。

在我的情況下,只有在Xcode中,當代碼在Interface Builder中的「Editor-> Refresh all views」過程中運行時纔會發生這種情況。在應用程序中運行時似乎沒有問題。我的代碼是iOS8框架的一部分(並且如此動態鏈接)。

我想,不管是什麼奇怪的原因,從[X類]得到了類和與NSClassFromString獲得那些不屬於同一個繼承層次。

你可以驗證當兩個類都從NSClassFromString獲得,你的測試會工作嗎?

相關問題