object_setClass в больший класс - PullRequest
11 голосов
/ 27 июля 2010

Я изменяю класс некоторых объектов, используя object_setClass(id object, Class cls).Я изменяю класс на подкласс исходного класса.Затем я установил некоторые свойства, которые определены только для подкласса, и, кажется, все работает нормально.

Я был немного удивлен, что это сработало, потому что object_setClass, насколько я понимаю, не перераспределяетобъект, он только изменяет указатель isa.Если экземпляры подкласса значительно больше (то есть имеют намного больше иваров), чем исходные экземпляры класса, я не вижу, как объект может работать так, как ожидалось.

Работает ли это только потому, что имеется много буферапамять между объектами в памяти (из-за выравнивания и т. д.)?

Является ли это надежным или может произойти сбой при некоторых обстоятельствах?

Ответы [ 2 ]

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

Может произойти сбой.Как видно из исходного кода среды выполнения здесь , он действительно просто меняет указатель isa.

Если вы действительно хотите поменять isa на isa подкласса с большим количеством иваров, вам следует использовать class_createInstance с ненулевым extraBytes.

3 голосов
/ 25 августа 2013

Вместо использования большего подкласса используйте objc_setAssociatedObject и objc_getAssociatedObject для динамического присоединения дополнительных объектов к существующему объекту фиксированного размера.

...