Обезьяна патч инстанс в Objective-C - PullRequest
2 голосов
/ 23 июля 2010

Я пытаюсь следовать (блестящим) инструкциям здесь , но у меня есть экземпляр класса, который я не могу изменить с помощью подклассов. Есть ли способ переопределить методы только для экземпляра класса?

Ответы [ 2 ]

6 голосов
/ 23 июля 2010

Осторожно. Вы собираетесь ввести в ObjC довольно глубокую магию, и ошибки, которые вы можете генерировать, просто ошеломляют. Это последние методы, которые вы должны использовать после того, как все остальное не удалось, и вы должны сделать все возможное, чтобы изолировать этот код. Тем не менее, ObjC является очень динамичным языком, и вы можете переписать большинство вещей.

Во-первых, к вашему конкретному вопросу вы можете изменить класс экземпляра, который достигнет того, что вы хотите. Правила в основном:

  • Новый класс должен быть подклассом предыдущего класса
  • Новый класс не должен добавлять никаких иваров. Добавление ivars в подкласс - это одна из вещей, которая может привести к упомянутым выше ошибкам.

Вы не получите никаких предупреждений или ошибок, если вы сделаете это неправильно. Вы просто получите странные сбои.

Учитывая, что изменить класс объекта на самом деле очень просто:

object->isa = [NewClass class];

Кроме того, вы можете изменить реализацию метода для каждого экземпляра класса, используя метод swizzling. У меня есть несколько примеров этого в Угон с методом method_exchangeImplementations () . Удачи вам в использовании отладчика, как только вы это сделаете.

1 голос
/ 23 июля 2010

На самом деле, вы можете изменить что-либо с помощью подклассов.Это одна из самых деликатных вещей, которые вы можете сделать, и вместо этого вы можете взглянуть на метод swizling (но метод swizling повлияет на всех членов класса), но в задаче c очень просто установить класс любого объекта, поэтомув основном все, что вам нужно сделать, это объявить подкласс, который не объявляет никаких дополнительных ivars, а только переопределяет нужные вам методы (и вы, вероятно, захотите вызвать супер реализацию), а затем изменяете класс объекта во время выполнения черезobject_setClass (объявлен в).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...