Pregunta

Entiendo que podemos usar referencias asociativas para invocar un comportamiento similar al de ivar en categorías.Pero, ¿cuál es la razón específica detrás de no poder declarar nuevos ivars en categorías?

¿Será porque invadiríamos el espacio privado de la clase?¿O hay alguna otra razón?En caso afirmativo, agradecería un ejemplo que muestre la capacidad de declarar ivars en categorías rompiendo lo que rompa.

¿Fue útil?

Solución

Piense en los ivars de Objective-C como una simple estructura C antigua.Cuando crea una instancia de una clase, se crea un bloque de memoria lo suficientemente grande como para contener esa estructura.

Digamos que tienes un NSString.Se compila muchísimo código existente para su uso. NSString.Gran parte de este código está integrado en bibliotecas y marcos.Ese código compilado fue creado sabiendo que los ivars de NSString toman X número de bytes y se encuentran en algunos desplazamientos determinados dentro de esa memoria.

Ahora, en tu pequeño proyecto, digamos que creas una categoría en NSString y quiero agregar un ivar.En teoría, cualquier código en su proyecto que incluya el archivo de encabezado para la categoría sabría que el tamaño de este "nuevo" NSString (más categoría) toma X + Y bytes.Esto es muy parecido a una subclase.Este código recién compilado podría manejar adecuadamente los ivar adicionales.

Pero todo el código precompilado, las bibliotecas y los marcos, no tendrían conocimiento de los ivars adicionales.Cuando NSString Las instancias se crean allí, la memoria es solo de X bytes, no de X + Y bytes.Se produce el caos cuando el código de su aplicación obtiene una referencia a esa porción más pequeña de memoria e intenta acceder a los bytes de la categoría ivar.Las cosas irían bien.

Con una subclase antigua y simple, las cosas funcionan porque cualquier código que pueda usar los ivars de la subclase conoce los ivars de la subclase.Pero con una categoría, el código preexistente no tiene conocimiento de las adiciones y no creará adecuadamente el espacio para ellas.

Supongo que debo especificar que todo lo anterior es en gran medida una suposición fundamentada.Podría estar totalmente equivocado.Al menos parece razonable.:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top