Я изменяю класс некоторого использования объектов object_setClass(id object, Class cls)
. Я изменяю класс на подкласс исходного класса. Затем я установил некоторые свойства, которые только определяются на подклассе, и вещи, кажется, хорошо работают.
Я был немного удивлен, что это работало, потому что object_setClass
, насколько я понимаю, не перераспределяет объект, он только изменяется isa
указатель. Если экземпляры подкласса значительно больше (значение наличия значительно большего количества ivars), чем исходные экземпляры класса, я не вижу, как объект может работать как ожидалось.
Это работает только потому, что существует много буферной памяти между объектами в памяти (из-за выравнивания и т.д.)?
Действительно ли это устойчиво, или это могло отказать при некоторых обстоятельствах?
Это может привести к краху. Как видно из исходного кода программы здесь, она действительно просто меняет местами указатель isa
.
Если вы действительно хотите поменять isa
на isa
подкласса с большим количеством ivars, вам следует использовать class_createInstance
с ненулевыми extraBytes
.