gpt4 book ai didi

ios - isKindOfClass 莫名其妙的身份问题

转载 作者:搜寻专家 更新时间:2023-10-30 20:16:43 26 4
gpt4 key购买 nike

我原以为这是一个身份,但它现在似乎对我不起作用。

看我的 lldb 提示符:

po [self class] ==> MyCustomClass

po [MyCustomClass 类] ==> MyCustomClass

po [self class] == [MyCustomClass class] ==> true

p [self isKindOfClass:[MyCustomClass class]] ==> '\0'(即 false)。

isKindOfClass 的定义:“返回一个 bool 值,指示接收者是给定类的实例还是从该类继承的任何类的实例。”

什么样的废话(我的错或其他原因)会导致这种行为?

关注者的背景知识:不幸的是,我正在使用第 3 方 API,它需要我将对象作为空指针传递,然后将其转换回正确的类型。尽管一切都编译得很好,但在运行时我被告知该对象无法识别我试图发送给它的选择器。这意味着(我认为?)它实际上不是我将其强制转换到的类的实例。在尝试对其进行测试时,我遇到了 [NSObject isKindOfClass] 的问题。这到底是怎么回事?

在 iOS 8.1 iPad 上运行,在 XCode 6.1.1 中构建。

这是上次测试的截图:

lldb screenshot


进度编辑:我终于设法在这个库运行的线程中使用 this post 设置了一个断点,并且看到了一些更疯狂的东西。

给定 (void*)data,我得到:

po [数据类] ==> MyCustomClass

po [data isKindOfClass:[MyCustomClass class]] ==> nil(同样,这只是表示 false)

显然,我真的在这里搞砸了一些东西。是否存在任何可能导致此类问题的已知问题?


编辑 SSCCE-ish 示例:您从一个裸 C 函数开始,该函数作为回调函数传递给后台库:

void libraryCallbackFunction(eventname, stuff, (void*)data)

库在事件发生时(从新线程)调用此函数,您使用此函数来处理事件。 data 应该是指向您要从此事件处理程序函数调出的任何旧类的指针。在这个函数中,您可以将数据转换为您想要的任何类。然后,您可以向主线程上的数据实例发送消息。我们称它为 View Controller :

void libraryCallbackFunction((void*)data) {
MyCustomClass *myViewController = (__bridge MyCustomClass*)data;

/* stuff stuff stuff */

dispatch_async(dispatch_get_main_queue(), ^{
[myViewController makeInterfaceChange];
});
}

这段代码对我来说编译得很好,但在运行时我遇到了一个错误:

NSInvalidArgumentException', reason: '+[MyCustomClass makeInterfaceChange]: 无法识别的选择器发送到类 0xf3fad8

所以换句话说,看起来 data 实际上并不指向 MyCustomClass 的实例。是的,makeInterfaceChange 是为 MyCustomClass 定义的,否则它不会编译。正如我之前提到的,在此函数的断点处从 lldb 调用 po [data class] 会得到 MyCustomClass

有什么想法吗?


等等,这会是吗?:这部分代码中的关键 (__bridge) 转换不是语法高亮显示,尽管它在我项目的其他任何地方。问题?或者只是 XCode 像往常一样对语法高亮很挑剔?是否存在任何可能导致 __bridge 无法工作的愚蠢错误?

最佳答案

您正在注册要传递给回调的类对象,而不是实例。这由异常消息中的 + 指示。

isKindOfClass: 的奇怪之处在于 [someClassObject class] 返回自身,而不是 its 类(这将是一个元类目的)。然而,一个类对象不是它自己的同类(不是它所代表的类的成员); they have their own (opaque) hierarchy .

[[NSString class] isKindOfClass:[NSString class]]

例如,产生与您的代码相同的结果:NO

关于ios - isKindOfClass 莫名其妙的身份问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27551963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com