objective-c – isKindOfClass Behavior

有人可以解释为什么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),它在测试中失败但在标准运行时工作.

任何想法为什么这可能只是测试时的问题?我的测试目标是否遗漏了什么?

解决

我已经将.m文件包含在测试目标编译源中.一旦删除,这开始按预期运行.感谢this post帮我解决这个问题.

解决方法

我在我的测试应用程序中添加了您的代码.我不得不更改两个实例变量的名称,之后编译器给了我一个警告(“类方法’alloc’未找到”),程序在运行时崩溃了.

然后我改变了这一行:

@interface BaseClass : NSObject

即我从NSObject派生出BaseClass.不再有编译器警告,代码按预期运行,即第二个isKindOfClass返回YES.

我不知道丢失的NSObject是否是导致你的问题的原因.如果不是那么其他人必须介入.如果是,我想知道你是如何运行你的代码的.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...