objective-c - tutorial - objective c vs swift
¿Qué hace la directiva @package en Objective-C? (2)
La documentación de Apple explica esto un poco, pero aquí hay un poco más de detalle ...
Las variables de instancia que se declaran bajo @package
solo serán accesibles por código del mismo marco, biblioteca o ejecutable. Esto es muy similar al internal
en C # y Friend
en VB.NET, pero otros lenguajes de programación también tienen esquemas de protección similares (Java tiene package-private
).
Por ejemplo, imagine un marco, RecipeKit.framework
, para administrar recetas:
@interface Recipe : NSObject {
@package;
NSString *name;
@private;
NSArray *ingredients;
}
@end
@interface RecipeController : NSObject
@end
El controlador de recetas podrá acceder directamente a los nombres de las recetas. Podrías escribir algo como esto en el RecipeController
ya que es parte del mismo marco:
Recipe *recipe = [[[Recipe alloc] init] autorelease];
[recipe->name autorelease];
recipe->name = [@"The best ever recipe!" retain];
Sin embargo, si escribiera el código anterior en una aplicación que vincule a RecipeKit
, causaría un error de compilación ya que no tiene acceso a esa variable. Por último, cuando se compilan para 32 bits, las variables declaradas en @package
comportan como si estuvieran declaradas en @public
, así que ten cuidado con las diferencias aquí.
Esta nueva característica recibió muy poca atención porque es solo una forma más de romper la encapsulación de tu clase. Como siempre ha sido cierto, probablemente sea mejor que trabaje solo con @private
variables @private
y que tenga métodos de acceso para ellas. De hecho, durante un tiempo Apple intentó impulsar esto al incluir @private
en sus plantillas. Con las propiedades en Objective-C 2.0, seguir con @private
es bastante fácil, y dependiendo de la plataforma a la que se dirija, puede omitir las variables de instancia por completo .
Imágenes
Una cosa que algunas de las respuestas anteriores dejaban un poco incierta era abordar el aspecto de las imágenes de la pregunta original. De hecho, la imagen de palabra como se usa en la descripción de @package
variables @package
no tiene nada que ver con las imágenes gráficas. En cambio, se refiere a imágenes que el enlazador dinámico puede cargar. En general, los ejecutables, los marcos y las bibliotecas dinámicas son todas imágenes consideradas por el vinculador (aunque se manejan de forma ligeramente diferente). Verás aparecer la imagen de la palabra de vez en cuando. Por ejemplo, un error de tiempo de ejecución común es: "imagen dyld no encontrada". También encontrará el uso de la imagen de la palabra dispersa en toda la documentación para dyld
. Leer la página man para dyld
podría ayudar a aclarar un poco la ambigüedad de esta palabra. UIImage
puede declarar variables como @package
, pero no tiene nada que ver con la imagen en lo que respecta a la pregunta original.
¿Alguien sabe exactamente para qué se usa la directiva @package en Objective-C?
La única mención que pude encontrar en Programación en Objective-C 2.0 por Stephen Kochan fue:
@package - Para imágenes de 64 bits, se puede acceder a la variable de instancia en cualquier lugar dentro de la imagen que implementa la clase
...
¿Qué? ¿Está restringido para ser utilizado con imágenes, como en las imágenes? ¿O significa imágenes como en imágenes de disco?
Es una descripción confusa, y no elabora nada en el resto del libro ...
Cualquier ayuda sería increíble, ¡gracias!
@package
es similar a internal
para .NET. Significa que solo se puede acceder al miembro desde el marco en el que está definido.
Nota: en 32 bits, actúa como @public
.