objective-c dynamic runtime objective-c-runtime

objective c - object_setClass a una clase más grande



objective-c dynamic (2)

Estoy cambiando la clase de algunos objetos usando object_setClass(id object, Class cls) . Estoy cambiando la clase a una subclase de la clase original. Luego establezco algunas propiedades que solo están definidas en la subclase, y las cosas parecen funcionar bien.

Me sorprendió un poco que esto funcionara, porque object_setClass , por lo que yo entiendo, no reasigna el objeto, solo cambia el puntero isa . Si las instancias de la subclase son considerablemente más grandes (es decir, tienen muchos más ivars) que las instancias de la clase original, no veo cómo el objeto puede funcionar como se esperaba.

¿Funciona esto solo porque hay una gran cantidad de memoria intermedia entre los objetos en la memoria (debido a la alineación, etc.)?

¿Es esto robusto o podría colapsar en algunas circunstancias?


Podría colapsar. Como se puede ver en el código fuente del tiempo de ejecución aquí , realmente solo intercambia el puntero isa .

Si realmente desea cambiar el isa a un isa de una subclase con más ivars, debe usar class_createInstance con extraBytes distintos de extraBytes .


En lugar de usar una subclase más grande, use objc_setAssociatedObject y objc_getAssociatedObject para adjuntar objetos dinámicamente adicionales a su objeto existente de tamaño fijo.