有人可以解释为什么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([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.我甚至尝试创建一个简化的示例(没有基础或派生的ivars),它在测试中失败但在标准运行时工作.
任何想法为什么这可能只是测试时的问题?我的测试目标是否遗漏了什么?
解决了