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