iphone objective-c class anonymous categories

iPhone Obj-C: categoría anónima o categoría "privada"?



objective-c class (2)

Estilo-sabio (y funcionalmente, si hay alguna diferencia), para declarar métodos privados, ¿cuál de estos es mejor?

@interface MyClass() @interface MyClass(private)


Sí,

hay las siguientes diferencias

1) Usar categorías anónimas requiere implementar sus métodos en el bloque @implementation principal para la clase correspondiente; las categorías anónimas le permiten declarar la API requerida adicional para una clase en ubicaciones que no sean dentro del bloque primario de la clase @interface

2) Cuando se utiliza MyClass (privado), se debe tener en cuenta lo siguiente: los pares nombrados de objetos / categorías deben ser únicos. Si declaras una categoría privada en tu propia clase, entonces no hay problemas. Sin embargo, las cosas son diferentes en las clases existentes. Por ejemplo, solo puede existir una categoría NSString (privada) en un espacio de nombres Objective-C determinado. Esto puede ocasionar problemas porque el espacio de nombres Objective-C se comparte entre el código del programa y todas las bibliotecas, marcos y complementos. Esto es especialmente importante para los programadores de Objective-C que escriben protectores de pantalla, paneles de preferencias y otros complementos porque su código se inyectará en el código de la aplicación o del marco que no controlan.


Las dos sintaxis sirven para diferentes propósitos.

Una categoría con nombre - @interface Foo (FooCategory) - generalmente se usa para:

(1) extender una clase existente agregando funcionalidad. Ejemplo: NSAttributedString in Foundation se extiende por una categoría en AppKit que agrega API de formato de texto similar a RTF de AppKit.

(2) declare un conjunto de métodos que un delegado podría o no implementar. Ejemplo: varias clases declaran, pero no implementan, @interface NSObject (SetODelegateMethods).

El formulario (2) ha caído en desuso ahora que @protocol se ha extendido para respaldar los métodos opcionales en Objective-C 2.0.

Una extensión de clase - @interface Foo () - está diseñada para permitirle declarar una API privada adicional - SPI o Interfaz de Programación del Sistema - que se usa para implementar las entrañas de clase. Esto normalmente aparece en la parte superior del archivo .m. Cualquier método / propiedad declarada en la extensión de clase debe implementarse en @implementation, al igual que los métodos / propiedades que se encuentran en la interfaz @ pública.

Las extensiones de clase también se pueden usar para redeclarar una @property de lectura pública como readwrite antes de @ sintetizar los accesors.

Ejemplo:

Foo.h

@interface Foo:NSObject @property(readonly, copy) NSString *bar; -(void) publicSaucing; @end

Foo.m

@interface Foo() @property(readwrite, copy) NSString *bar; - (void) superSecretInternalSaucing; @end @implementation Foo @synthesize bar; .... must implement the two methods or compiler will warn .... @end