2009-02-17 9 views
5

En Objective-C, puede cambiar el tipo de dinámica de un objeto en tiempo de ejecución mediante la asignación a que es isa variable miembro:¿Es comportamiento definido cambiar el isa de un objeto Objective-C?

id object = ...; 
object->isa = [SomeClass class]; 

¿Este comportamiento indefinido? Actualmente estoy haciendo esto como un desafío para otra cosa, y parece estar funcionando, pero me siento tan sucio haciéndolo de esta manera. La nueva clase que estoy configurando no agrega ninguna variable miembro, simplemente anula un método y agrega uno nuevo, por lo que el tamaño de clase es el mismo. Siento que si cambiara el tamaño del objeto, se produciría mucha maldad.

+0

posible duplicado de [Objective-C: ¿Cómo cambiar la clase de un objeto en tiempo de ejecución?] (Http://stackoverflow.com/questions/8512793/objective-c-how-to-change-the-class- of-an-object-at-runtime) –

+0

Puede encontrarse con problemas con KVO. También usan isa-swizzling. Mike Ash tiene una solución completa, sin embargo: http://www.mikeash.com/pyblog/friday-qa-2010-11-19-creating-classes-at-runtime-for-fun-and-profit.html – nielsbot

Respuesta

1

Creo que esto es, como dices, sucio.

sospecho que va a funcionar si:

  • La clase recién asignado es una subclase de la clase real.
  • La nueva clase no agrega ninguna variable miembro.

Pero admito que no conozco la implementación de las tuercas y pernos de su sistema de tiempo de ejecución Objective-C. Solo sé lo que tiene sentido para una implementación.

0

Es una mala forma cambiar esto, y hace todo tipo de suposiciones sobre el comportamiento del tiempo de ejecución: es mucho mejor usar el runtime functions aunque no le proporcionan un mecanismo para cambiar directamente la clase.

+0

Sé así es como funciona KVO sin embargo – nielsbot

0

This answer de Joshua Weinberg proporciona la manera correcta de hacerlo. Funcionó para mí :)

Y Darron tenía razón con su conjetura educada :) solo funcionará si es una superclase del objeto actual, y si no agrega ningún miembro.

1

El tiempo de ejecución de Objective-C ahora proporciona una función para hacer esto: object_setClass. La documentación no indica qué restricciones existen, pero (como han indicado otros), imagino que desearía restringir la nueva clase a una clase con exactamente el diseño de la variable de instancia como clase original.

Cuestiones relacionadas