Как я могу определить, является ли мой объект действительно NSProxy? - PullRequest
2 голосов
/ 16 июля 2011

Я немного ковыряюсь в некоторых из наиболее подозрительных объектов, которые мне предоставляют API Apple (например, mutableArrayValueForKeyPath), и меня удивляет, как часто Apple дает мне то, что я считаю определенным объектом, но на самом делепросто NSProxy, который тайно также уведомляет другие объекты или фильтрует мои сообщения.

Есть ли способ узнать, является ли объект подклассом NSProxy?Похоже, они очень хорошо имитируют то, что представляют.

Ответы [ 2 ]

4 голосов
/ 16 июля 2011

Вы всегда можете посмотреть на self->isa.

3 голосов
/ 16 июля 2011

Чтобы узнать, является ли это NSProxy или нет, используйте isProxy, см. ссылку .

Но учтите также, что Apple использует много других внутренних магий, не только NSProxy.Например, чтобы реализовать KVC / KVO, они часто создают анонимный класс, который лежит в своем собственном классе, вставляют его в иерархию классов и изменяют идентичность объекта.Смотрите, например, хорошее обсуждение Майка Эша в этой пятничной статье вопросов и ответов .(Кстати, вам обязательно следует прочитать этот блог, если вам интересно узнать о времени выполнения Objective-C.)

Как написано там, самый надежный способ раскрыть истинную идентичность объекта - это использовать среду выполнения.см. здесь .

    id obj;
    Class c=object_getClass(obj);

дает вам истинный класс.Обратите внимание, что объект может лгать, что он есть, повторно реализуя [obj class]!

...