Как я могу определить, является ли мой объект действительно NSProxy?

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

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

2 ответа

Решение

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

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

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

    id obj;
    Class c=object_getClass(obj);

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

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

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