Object_setClass для большего класса

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

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

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

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

Ответ 1

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

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

Ответ 2

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