Определено ли поведение для изменения isa объекта Objective-C? - PullRequest
5 голосов
/ 17 февраля 2009

В Objective-C вы можете изменить динамический тип объекта во время выполнения, присвоив ему isa переменную-член:

id object = ...;
object->isa = [SomeClass class];

Это неопределенное поведение? В настоящее время я делаю это как стимул для чего-то другого, и это, кажется, работает, но я чувствую себя таким грязным, делая это таким образом. Новый класс, который я устанавливаю, не добавляет никаких переменных-членов, он просто переопределяет один метод и добавляет новый, поэтому размер класса такой же. Я чувствую, что если бы я изменил размер объекта, это привело бы к большому ухудшению качества.

Ответы [ 4 ]

1 голос
/ 28 августа 2013

Среда выполнения Objective C теперь предоставляет функцию для этого: object_setClass. В документации не говорится, какие существуют ограничения, но (как уже заявляли другие), я думаю, вы захотите ограничить новый класс классом с макетом переменной экземпляра, точно таким же, как и у исходного класса.

1 голос
/ 17 февраля 2009

Я думаю, что это, как вы говорите, грязно.

Я подозреваю, что это будет работать, если:

  • Вновь назначенный класс является подклассом реального класса.
  • Новый класс не добавляет никаких переменных-членов.

Но я признаю, что не знаю, как реализовать вашу систему Objective-C. Я просто знаю, что для меня имеет смысл для реализации.

0 голосов
/ 09 января 2012

Этот ответ Джошуа Вайнберга дает правильный способ сделать это. Это сработало для меня. :)

И Даррон был прав с его образованным предположением :) это сработает, только если это суперкласс текущего объекта, и если вы не добавите ни одного члена.

0 голосов
/ 18 февраля 2009

Это действительно плохая форма, чтобы изменить их, и она делает всевозможные предположения о поведении во время выполнения - вам гораздо лучше использовать функции времени выполнения , хотя они не предоставляют вам механизм для прямо поменяйте класс.

...