有人可以解釋爲什麼isKindOfClass根據實例的創建方式返回不同的結果嗎?isKindOfClass行爲
@interface BaseClass
...
@interface DerivedClassA : BaseClass
...
DerivedClassA *instance = [[DerivedClassA alloc] init];
[instance isKindOfClass:[BaseClass class]]; // yields YES
Class c = NSClassFromString(@"DerivedClassA");
id instance = [[c alloc] init];
[instance isKindOfClass:[BaseClass class]]; // yields NO
我可以從調試器中的兩種類型中收集的其他東西都是相同的。我甚至可以比較NSStringFromClass([實例超類])的結果和它們相等。
我必須缺少一些簡單的東西。
更新的代碼
這是單元測試代碼。
LightingUnit *u1 = [[LightingUnit alloc] init];
STAssertTrue([u1 isKindOfClass:[ModelBase class]], @"should be derived from base");
Class uc = NSClassFromString(@"LightingUnit");
id u2 = [[uc alloc] init];
STAssertTrue([u2 isKindOfClass:[ModelBase class]], @"should be derived from base");
這裏是類定義。
@interface ModelBase : NSObject
@property (readonly) NSString *__type;
- (id)initWithDictionary:(NSDictionary *)dictionary;
- (NSMutableDictionary *)dictionary;
@end
@interface LightingUnit : ModelBase
@property (strong, nonatomic) NSString *name;
@property NSInteger unitId;
@end
可能的答案
當我在測試環境中的作品外運行這個邏輯沒有問題。顯然唯一的區別是刪除STAssertTrue語句並將其替換爲我的條件。在這種情況下,他們都返回YES。我甚至嘗試創建一個簡化的示例(無基礎或派生ivars),它在測試中失敗,但在標準運行時工作。
任何想法,爲什麼這可能只是一個問題,當測試?我的測試目標是否缺少某些東西
解決
我已經包含在測試目標編譯源代碼的.m文件。一旦刪除,開始按預期行事。感謝this post幫助我解決這個問題。
剛試過,得到兩個YES。嘗試打印'實例'類 –
是否應該是'BaseClass:NSObject'?這個問題的答案將改變你的問題的答案。 – Ephemera
你需要粘貼你的真實代碼。你的示例代碼工作得很好,只要我把'BaseClass'作爲'NSObject'的一個子類(它甚至不會編譯)。 –