objective-c – isKindOfClass Behavior

前端之家收集整理的这篇文章主要介绍了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是否是导致你的问题的原因.如果不是那么其他人必须介入.如果是,我想知道你是如何运行你的代码的.

原文链接:https://www.f2er.com/c/118548.html

猜你在找的C&C++相关文章