Objectivo-C Nivel de package Propiedad

Estoy creando un marco personalizado para iPhone que debería poder integrarse en cualquier aplicación de iPhone.

He creado algunas properties en uno de los files de encabezado públicos de mi marco. Quiero dar acceso a nivel de @package a esas properties, de modo que solo se pueda acceder a esas properties en las classs dentro del marco.

No quiero que el usuario use esas properties.

Por favor, dígame si hacer esto es posible. Si es así, ¡dame una idea de cómo lograr esto!

Primero debe saber que no hay manera de prohibir por completo que un usuario de su biblioteca llame a un método. Incluso si no lo declara en su encabezado, un usuario puede declararlo por sí mismo y usarlo. Aún así, tendría que averiguar el nombre de su propiedad, por ejemplo, ejecutando classdump en su biblioteca.

Por lo tanto, en Objective-C, hacemos las properties privadas al no declararlas en el encabezado (que es la parte pública de su class), sino declarándolas en la implementación (que es la parte "privada" de su class).

Si crea otro encabezado que contiene una categoría en su class, puede agregarle algunas properties que no estarán en el encabezado principal, por lo tanto, no en la statement pública de su class, pero que otras classs de su biblioteca que sabe sobre este encabezado

Por ejemplo:

 MyClass+SecretProperties.h: @interface MyClass () @property (strong) NSString *secretString; @end MyClass.m: #import "MyClass.h" #import "MyClass+SecretProperties.h" @implementation MyClass @synthesize secretString; // Depending on your runtime, you may not even need to this - properties are auto-synthesized in the latest SDKs. … @end OtherClass.m: #import "MyClass.h" #import "MyClass+SecretProperties.h" // Now you can use secretString on instances of MyClass 

Entonces, dado que solo exporta MyClass.h con su biblioteca, los usuarios no tienen idea de que hay una propiedad secretaString 🙂 Esto es lo más cercano que puede llegar a un scope de package AFAIK.

Si desea convertir esas properties en privadas, utilice las cosas a continuación. En su file .m, use las características de extensión del objective c.

 @interface InitialViewController () //declare your property here @end