インスタンスの作成方法に応じて 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
デバッガーで 2 つの型から収集できる他のすべては同じです。NSStringFromClass([instance superclass]) の両方の結果を比較することもでき、それらは等しいです。
私は単純なものが欠けているに違いありません。
更新されたコード
これは単体テスト コードです。
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 を返します。簡単な例を作成しようとしました (ベースまたは派生に ivar はありません)。テストでは失敗しますが、標準のランタイムでは動作します。
これがテスト時にのみ問題になる理由はありますか? テスト ターゲットに何か不足がありますか?
解決済み
テスト ターゲットのコンパイル ソースに .m ファイルを含めました。削除すると、これは期待どおりに動作し始めました。これを解決するのを手伝ってくれたこの投稿に感謝します。