Как определить, указывает ли указатель void * на объект t arget-c или объект C++ во время выполнения

Я некоторое время искал вокруг, но удивился, что никто никогда не задавал этот вопрос, так что я иду:

У меня есть метод Objective-C, который принимает аргумент id. Теперь я хочу использовать respondsToSelector: чтобы определить, действительно ли это для следующих действий, если нет, у меня есть план резервного копирования для него. (Который не ASSERT(0):П)

Итак, когда кто-то пытается испортить мне и передать (id)someC++ObjectУ меня, конечно, большая авария.

Мой вопрос прост: могу ли я заставить объект C++ потерпеть неудачу respondsToSelector: безопасно, чтобы я мог использовать свой план резервного копирования (пробивая кодер в лицо для одного)?

1 ответ

Решение

Короче говоря, вы не можете.

По крайней мере, ненадежно и не в любом случае. Честно говоря, не должно беспокоить; этот уровень защитного программирования совершенно бесполезен перед лицом языка Си.

По крайней мере, вам необходимо:

  • проверить, что указатель указывает на доступную память
  • указывая на текущее распределение
  • блок первого размера указывает на класс Objective-C (возможно, включая производные классы)

В общем, любой код, который интенсивно использует isKindOfClass: а также respondsToSelector: (вне шаблона делегирования) совершенно нетипично нормам шаблонов проектирования Objective-C.

Или, другими словами, у вас есть статический компилятор проверки типов, который неплохо проверяет множество параметров валидности во время компиляции. Используй это.

Другие вопросы по тегам