ultima tutorial objective logo objective-c

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 .