object_setClass к большему классу

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

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

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

Действительно ли это устойчиво, или это могло отказать при некоторых обстоятельствах?

12
задан Felixyz 27 July 2010 в 18:55
поделиться

1 ответ

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

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

6
ответ дан 2 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: