objective-c - rendimiento - tablas grandes mysql
¿Por qué no pueden las categorías tener variables de instancia? (1)
Entiendo que podemos usar referencias asociativas para invocar comportamientos similares a 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 que rompen lo que se rompe
Piense en los ivars del Objective-C como una simple estructura en 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
. Mucho y mucho código existente se compila para usar NSString
. Gran parte de este código está integrado en bibliotecas y marcos. Ese código compilado se creó sabiendo que los ivars de NSString
toman X número de bytes y están en algunas compensaciones dadas dentro de esa memoria.
Ahora, en su propio pequeño proyecto, digamos que crea una categoría en NSString
y desea agregar un ivar. En teoría, cualquier código en su proyecto que incluya el archivo de encabezado de la categoría sabría que el tamaño de este "nuevo" NSString
(más la 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 (s) adicionales.
Pero todo el código precompilado, las bibliotecas y los marcos, no tendrían conocimiento de los ivars adicionales. Cuando se NSString
instancias de NSString
allí, la memoria es solo de X bytes, no de X + Y bytes. El caos se produce a medida que el código de tu aplicación obtiene una referencia a ese fragmento de memoria más pequeño e intenta acceder a los bytes de la categoría ivar. Las cosas irían en auge.
Con una subclase antigua, las cosas funcionan porque cualquier código que pueda usar los ivars de la subclase sabe acerca de los ivars de la subclase. Pero con una categoría, el código preexistente no tiene conocimiento de las adiciones y no creará correctamente el espacio para ellas.
Supongo que debería especificar que todo lo anterior es en gran medida una suposición educada. Podría estar totalmente equivocado. Parece razonable al menos. :)