如何确定 void * 指针在运行时指向 objective-c 对象还是 c++ 对象

How can I determine whether a void * pointer points to a objective-c object or a c++ object at runtime

本文关键字:对象 objective-c c++ 运行时 void 何确定 指针      更新时间:2023-10-16

我已经搜索了一段时间,但惊讶于没有人提出这个问题,所以我在这里:

我有一个接受id参数的Objective-C方法。现在我想使用 respondsToSelector: 来确定它是否适用于以下操作,如果不是,我有一个备份计划。(这不是ASSERT(0) :P)

所以,当有人试图搞砸我并通过(id)someC++Object时,我当然会崩溃。

的问题很简单:我可以让C++对象安全地使respondsToSelector:失败,以便我可以使用我的备份计划(打打编码员的脸)?

简而言之,你不能。

至少,不可靠,也不以任何理智的方式。 坦率地说,也不应该打扰; 面对基于C的语言,这种级别的防御性编程是完全徒劳的。

至少,您需要:

  • 验证指针是否指向可访问的内存
  • 指向当前分配
  • 第一个地址大小的块指向一个 Objective-C 类(可能包括派生类)

通常,任何大量使用isKindOfClass:respondsToSelector:(在委托模式之外)的代码都与Objective-C设计模式的规范非常不典型。

或者,换句话说,

你有一个静态类型检查编译器,它非常擅长在编译时检查大量有效性参数。 使用它。