Как определить, указывает ли указатель void * на объект t arget-c или объект C++ во время выполнения
Я некоторое время искал вокруг, но удивился, что никто никогда не задавал этот вопрос, так что я иду:
У меня есть метод Objective-C, который принимает аргумент id. Теперь я хочу использовать respondsToSelector:
чтобы определить, действительно ли это для следующих действий, если нет, у меня есть план резервного копирования для него. (Который не ASSERT(0)
:П)
Итак, когда кто-то пытается испортить мне и передать (id)someC++Object
У меня, конечно, большая авария.
Мой вопрос прост: могу ли я заставить объект C++ потерпеть неудачу respondsToSelector:
безопасно, чтобы я мог использовать свой план резервного копирования (пробивая кодер в лицо для одного)?
1 ответ
Короче говоря, вы не можете.
По крайней мере, ненадежно и не в любом случае. Честно говоря, не должно беспокоить; этот уровень защитного программирования совершенно бесполезен перед лицом языка Си.
По крайней мере, вам необходимо:
- проверить, что указатель указывает на доступную память
- указывая на текущее распределение
- блок первого размера указывает на класс Objective-C (возможно, включая производные классы)
В общем, любой код, который интенсивно использует isKindOfClass:
а также respondsToSelector:
(вне шаблона делегирования) совершенно нетипично нормам шаблонов проектирования Objective-C.
Или, другими словами, у вас есть статический компилятор проверки типов, который неплохо проверяет множество параметров валидности во время компиляции. Используй это.