2013-02-18 1 views
1

Мой вопрос может показаться странным, но я хочу получить эту идею вокруг умов Штаберов, в моей работе я только заметил, что каждый протокол все время соответствует классу, я задавался вопросом о возможности сделать простой объект также соответствует протоколам, а если нет (и почти нет), почему бы и нет?Возможно ли, чтобы NSObject соответствовал протоколу? и если это, то как? -Подумай серьезно

Цените ваше беспокойство

ответ

1

Есть две части протокола соответствия:

  • объект должен реагировать на необходимые сообщения в определении протокола
  • объект должен вернуть YES, когда его спросили ли соответствует его к протоколу

Итак, можем ли мы организовать экземпляр NSObject t o удовлетворяют этим двум условиям? Да. Фактически, есть по крайней мере два способа сделать это. Сначала давайте сделаем все экземпляры NSObject соответствуют протоколу. Мы делаем это, чтобы определить методы протокола в категории по NSObject, которая решает первую часть. Затем мы «swizzle» (что означает использование функции времени исполнения class_replaceMethod()) -[NSObject conformsToProtocol:], возвращая YES для нашего интересного протокола.

Теперь давайте представим, что вы хотите сделать конкретным экземпляр NSObject соответствует протоколу. Это немного проще. Сначала создайте подкласс NSObject, который соответствует протоколу и реализует необходимые методы; нет необходимости переопределять -conformsToProtocol:, потому что библиотека времени выполнения может видеть, что этот класс соответствует. Теперь во время выполнения возьмите свой экземпляр NSObject и вызовите object_setClass(), чтобы переключить свой класс на соответствующий подкласс.

+0

Есть еще одна часть соответствия протокола: 'class_conformsToProtocol()' – newacct

+0

Отличный ответ, я считаю, что это проблема вокруг основной проблемы, она работает, я признаю, что подкласс и категории - это решения проблемы, моя цель - если какой-либо манекен объект в любом месте (независимо от класса) определен для ответа на протокол сообщений и определяет также, что «ДА» соответствует этому протоколу, поэтому нет необходимости устанавливать класс или подкласс или категорию, которая действует как план для этого объекта, вы может называть это «динамическим классом !!» То, как я сейчас обсуждаю, как-то новый, но я думаю, что это возможно Оцените свою озабоченность – Meseery

0

Вы можете добавлять протоколы к классам во время выполнения, используя функцию времени выполнения class_addProtocol(). Однако, делая это, когда класс не реализует все методы протокола, вероятно, приведет к плохим результатам.

+0

вы правы, используя метод class_addProtocol() во время выполнения, но как бы вы могли определить методы, необходимые для этого протоко l соответствие? и что, если этот протокол требует методов? – Meseery

+0

@Meseery: вы можете добавлять методы в класс, используя 'class_addMethod()' – newacct