3

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

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

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

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

4

1 回答 1

4

简而言之,你不能。

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

至少,您需要:

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

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

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

于 2012-05-12T03:58:08.467 回答