2009-05-18 15 views
7

Obj-C 2.0 me permite declarar propiedades en una categoría, pero el compilador se niega a sintetizar accesos dentro de la categoría. ¿Por qué?¿Por qué no puedo @synthesize accessors en una categoría?

(A veces tiene sentido poner un montón de cosas relacionadas en una categoría, incluso si el iVars de respaldo va en la declaración de la clase. Sé acerca de las extensiones de clase y cómo hacer propiedades privadas, pero ese no es mi caso de uso.)

Respuesta

0

La pregunta que se hace allí cubre el problema del acceso privado. Esto se aproxima desde un punto de vista de acceso no privado.

9

El problema es que las categorías están lógicamente separadas de sus clases, e incluso se almacenan por separado en el archivo binario. La implementación interna es que una estructura de descripción de clases contiene una matriz de listas de métodos que inicialmente contiene solo la lista de métodos definidos en el bloque principal @implementation. A medida que los módulos del enlazador ObjC cargan nuevas categorías, sus listas de métodos se agregan a esa matriz.

Debido a esta implementación, las categorías en sí mismas no tienen acceso al almacenamiento de una clase y, por lo tanto, no pueden modificarlo (también abre la pregunta de qué hacer cuando la categoría no está cargada).

Por último, desde una perspectiva más lógica que técnica, la idea es que una categoría no tiene 'propiedad' de la estructura en memoria de una clase, simplemente asocia algunos métodos nuevos. Para soportar completamente la síntesis de propiedades, necesitaría modificar el almacenamiento de la clase de alguna manera

¿La solución? O colocas las sentencias @synthesize dentro de tu bloque @implementation principal, o simplemente implementas tus propios accesos directamente dentro de la categoría @implementation.

+0

Déjame ser más específico. He dividido algunos métodos en una categoría para fines de organización, y como soy el propietario de la clase, agregué iVars apropiados a la interfaz de clases. Pero todavía no puedo @sintetizar los métodos en la categoría. ¿Hay alguna razón técnica por la que no? Todavía no veo uno. –

+0

Eso realmente no hace una gran diferencia. El hecho de que usted es el autor tanto de la clase como de la categoría no está codificado por el tiempo de ejecución de ninguna manera, por lo que la categoría sigue siendo solo una entidad separada sin conexión con los especificadores de almacenamiento de la clase a la que hace referencia. Como dije, es una especie de mecanismo de "protección", solo tienes que @sintetizar las variables dentro del bloque @implementation principal para la clase (eso funciona bien para mí). –

Cuestiones relacionadas