誰かが、isKindOfClassがインスタンスの作成方法によって異なる結果を返す理由を説明できますか?isKindOfClass Behavior
@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([インスタンススーパークラス])の両方の結果を比較することもできますが、それらは等しいです。
私は単純なものを紛失しているはずです。
更新されたコード
これは、ユニットテストコードです。
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に感謝します。
試したところ、2件あります。 'instance'のクラスを試してみてください。 –
これは' BaseClass:NSObject'になっていますか?その質問に対する答えはあなたの質問に対する答えを変えます。 – Ephemera
実際のコードを貼り付ける必要があります。サンプルコードは、 'BaseClass'を' NSObject'のサブクラスにしている限り、うまく動作します(別の方法でもコンパイルされません)。 –