2010-10-15 11 views
16

¿Cuál es la diferencia entre un método privado y una interfaz privada? Por ejemplo, sé que si define un método en una implementación y su interfaz no lo menciona, se considera un método privado. También he visto cosas como:Interfaz privada vs. método privado: objetivo c

@interface Collector() 
@property (readonly) NSMutableDictionary *count; 
@end 

Dentro del archivo de implementación .m.

Respuesta

20

@interface Foo() crea una extensión de clase (I corrected, props to bbum) en la interfaz Foo que es como métodos adicionales agregados a la interfaz. Algunas personas también usan @interafce Foo(Private) (categoría) en lugar de una extensión de clase con (). Es más como "inyectar" nuevos métodos en una clase desde fuera de la clase.

Colocar esto en el archivo .m solo evita que otras cosas "lo vean" en el archivo .h, pero eso es todo. Básicamente, las personas normalmente usan categorías o extensiones de clase en archivos .m para especificar interfaces privadas, pero también se usan para cosas como UIKit usa categorías para agregar los métodos públicos row y section a NSIndexPath. (Esto puede ser confuso.)

Realmente no necesita definir métodos privados de esta manera, pero si tiene un método llamado bar que llama al método foo antes de que foo se defina en el archivo fuente, obtendrá un compilador advirtiendo algo así como "el objeto no puede responder a foo". Puede deshacerse de eso definiendo foo antes de definir la barra o cualquier otro código foo-calling. Es lo mismo con C simple y funciones.

Like Ole dice que esto no impide que nadie llame a los métodos privados, solo declara su intención de que sean privados y hace que el compilador genere las advertencias de "no responder" incluso si importan el archivo .h .

EDITAR

Véase también http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ alguna explicación de las categorías en comparación con las extensiones de clase. Parece que las extensiones de clase deberían ser más correctas para definir métodos privados, desde una perspectiva de advertencia del compilador, porque los métodos de categoría son opcionales. ¡Ojalá mi libro hubiera explicado esto!

+8

Hay una gran diferencia entre las categorías nombradas '(foo)' y una extensión de clase '()'. – bbum

+0

¿Tiene una referencia a esto? No veo nada en el libro "Programación en Objective-C 2.0" sobre esto. Parece que el nombre de la categoría es simplemente opcional de todo lo que puedo decir. No es que sea un experto importante ni nada por el estilo, pero sería útil si pudiera proporcionar un enlace que explique la diferencia entre (Privado) y(). – Nimrod

+0

No importa, parece que encontré tu blog http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ ¿Te preguntas por qué mi libro no habla de esto? – Nimrod

17

Objective-C no tiene métodos totalmente privados. El método declarado en una sección de interfaz privada en el archivo .m es invisible para llamantes externos, pero no es privado. Si alguien conoce la firma del método e ignora la advertencia del compilador, pueden llamarlo desde afuera sin problemas.