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

时间:2012-05-12 03:12:42

标签: c++ objective-c runtime respondstoselector

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

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

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

我的问题很简单:我可以安全地使一个C ++对象失败respondsToSelector:,这样我就可以使用我的备份计划(面对一个编码器)吗?

1 个答案:

答案 0 :(得分:4)

简而言之,你不能。

至少,不可靠而且没有任何理智的方式。坦率地说,也不应该打扰;面对基于C的语言,这种防御性编程水平是徒劳的。

至少,你需要:

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

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

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