isKindOfClass 在 PromiseKit 中返回 nil 吗?

Posted

技术标签:

【中文标题】isKindOfClass 在 PromiseKit 中返回 nil 吗?【英文标题】:isKindOfClass returning nil inside PromiseKit? 【发布时间】:2015-05-23 22:44:13 【问题描述】:

我和我的同事正在大量基于PromiseKit v1.5.3 构建一个异步数据层。我们注意到在某些情况下,当从传递给 then 的块返回一个承诺(称为 X)时,下一个 then 块实际上将 Promse X 作为参数传递给块,而不是前一个承诺实际上决心。链接 thenable Promise 是大多数 Promise 实现的一个非常重要的特性,所以我们非常惊讶。

经过一些相当长的调试会话后,我们发现问题出在 PromiseKit 中。在解析过程中,IsPromise调用未能将对象识别为promise,这实际上是一个简单的调用

[result isKindOfClass:[PMKPromise class]]

此调用返回nil,并执行了错误的分支。 Here's the source

这件事令人费解的是,我看不出有任何理由发生这种情况。我不认为这是 PromiseKit 中的错误,因为他们的代码似乎是正确的。我已经确认底层对象确实是一个 PMKPromise,因为它响应诸如 valuefulfilled 之类的承诺方法。我什至使用调试器将它推过正确的分支,它从那里正确执行!

Here's an interesting log from some tests while halted at the given line.

鉴于isKindOfClass 正在返回nil,听起来该对象没有响应消息……但它肯定是一个NSObject。我很好奇这是否可能是一个奇怪的编译器设置或其他东西。如果相关,我目前将优化设置为无。有没有人见过这样的事情或知道发生了什么?我应该检查什么?

【问题讨论】:

isKindOfClass 返回一个 BOOL。在最好的情况下很难从nil 中分辨出来,如果你将nil 传递给isKindOfClass,那就更难了。 顺便说一句,po 表示“打印对象”。 如果不赞成投票的人可以表达他们的抱怨,很高兴补充这个问题? isKindOfClass返回nil。如果它愿意,它就做不到。 在控制台尝试po NO 【参考方案1】:

当您设法在项目中两次使用相同的类时,isKindOfClass 会返回意外结果。所以你可能有一个 PMKPromise 类的对象,但它是一个不同的类(具有完全相同的类名,完全相同的行为,只是第二个类)。也许这就是发生的事情。显然设置断点并检查对象是什么会有所帮助。

【讨论】:

这正是问题所在。检查符号表,我们的 cocoapods 库被链接到测试目标和应用程序目标。重新组织我们的 Podfile 以在测试目标上使用 exclusive 标志,这样就成功了。谢谢!

以上是关于isKindOfClass 在 PromiseKit 中返回 nil 吗?的主要内容,如果未能解决你的问题,请参考以下文章

🔥isKindOfClass 和 isMemberOfClass

isKindOfClass:和isMemberOfClass:-b

isKindOfClass 在 PromiseKit 中返回 nil 吗?

isKindOfClass:在单元测试包中返回false negative

iOS isKindOfClass 和 isMemberOfClass 的区别

isKindOfClass VS isMemberOfClass