奇怪的`isKindOfClass`行为

Posted

技术标签:

【中文标题】奇怪的`isKindOfClass`行为【英文标题】:Strange `isKindOfClass` behaviour 【发布时间】:2011-01-20 11:00:20 【问题描述】:

参考下面的代码,我发现isKindOfClass 无法识别一个类。

id parent = [self.tableDataSource objectAtIndex:indexPath.row];
//parent Can be either 'document' or 'folder'


    NSLog(@"'%@'='%@' ?",[parent class],[Document class]);  
BOOL classCheck = [[parent class] isKindOfClass:[Document class]];  
NSLog (@"%@", classCheck? @"Yes!" : @"No!");

控制台日志:

2011-01-20 10:44:29.746 ApplicationName[906:307] 'Document'='Document' ? 2011-01-20 10:44:29.756 应用程序名称[906:307]否!

以前有人遇到过这种情况吗?

【问题讨论】:

【参考方案1】:

[parent isKindOfClass:[Document class]] 应该返回 YES。 [parent class] 是一个类对象,它很可能不是类 Document 的实例。

这就是NSLog() 打印类名的原因(来自文档):

+ (NSString *) description

NSObject 对此的实现 方法只是打印名称 类。

【讨论】:

如果它不是 Document 的实例,那么为什么日志会显示 'Document'='Document' 尽管操作系统可能无关紧要,但添加 iphone ipad 和 ios 可以获得更好的观看次数,因为它们是最受欢迎的标签 因为 NSLog 中的 %@ 调用对象的(不管它是什么)description 方法,在这种情况下它只返回一个类名作为字符串。认为这是一个巧合。 好的,我恢复了标签。对不起。【参考方案2】:

你应该写:[ parent isKindOfClass: [ Document class ] ]

[ parent class ] 将返回一个 Class 对象,而 Class 对象不是一种 Document。

【讨论】:

以上是关于奇怪的`isKindOfClass`行为的主要内容,如果未能解决你的问题,请参考以下文章

isKindOfClass:和isMemberOfClass:-b

🔥isKindOfClass 和 isMemberOfClass

isKindOfClass和isMemberOfClass

isKindOfClass 抓取标签

OC中isKindOfClass与isMemberOfClass的区别

isKindOfClass VS isMemberOfClass