Objective-C调用isKindOfClass判断自定义TableViewCell类型结果异常
问题根因
类名字符串完全一致但isKindOfClass:返回NO,本质是同名的EditItemTableViewCell类被编译进了至少两个不同的二进制模块,Runtime加载时生成了两个内存地址完全不同的类对象,虽然类名相同,但属于完全独立的两个类,所以类型判断会返回NO。
常见触发场景
EditItemTableViewCell.m的Target Membership勾选了多个目标:比如同时加进了主App target、Extension target(通知扩展、手表扩展等)、自定义动态库/静态库target- 项目引入的第三方依赖中包含同名的
EditItemTableViewCell类实现,和你自己写的类产生了符号冲突 - Storyboard关联Cell类时选错了Module:在Storyboard的Identity面板给Cell指定自定义类时,Class下方的Module选了其他模块,而你代码中引用的
EditItemTableViewCell属于主target,导致Storyboard实例化出来的Cell是其他模块下的同名类
排查解决步骤
- 选中
EditItemTableViewCell.m文件,打开Xcode右侧的File inspector面板,检查Target Membership配置,确认只勾选了你当前运行的主App target,取消其他所有target的勾选 - 打开Storyboard找到对应的TableViewCell,打开Identity inspector面板,确认Class选项下方的Module和你代码中该类所属的Module一致,建议直接勾选「Inherit From Target」选项避免手动选择错误
- 可以新增日志打印类的内存地址进一步确认问题:
NSLog(@"Cell类地址:%p,引用类地址:%p", [cell class], [EditItemTableViewCell class]);
如果两个地址不同,就可以确认是类重复加载的问题,按照上述步骤调整即可
4. 如果配置调整完成后仍然报错,清空Xcode的Derived Data文件夹后重新编译运行即可解决
内容的提问来源于stack exchange,提问作者gemini0725
相关产品推荐
相关产品推荐

