2009-12-22 18 views

Respuesta

54

usted encontrará que extern se utiliza ampliamente en los marcos de cacao, y uno estaría en apuros para encontrar un argumento convincente de que su OO está "malcriado". Por el contrario, Cocoa está bien encapsulado y solo expone lo que debe, a menudo de forma externa. Las constantes definidas globalmente son ciertamente el uso más común, pero no necesariamente el único uso válido.

IMO, utilizando extern no necesariamente "estropea" la orientación del objeto. Incluso en OO, es frecuente usar variables accesibles desde cualquier lugar. El uso de extern es la solución más frecuente para la falta de "variables de clase" (como las declaradas con static en Java) en Objective-C. Le permite ampliar el alcance en el que puede hacer referencia a un símbolo más allá de la unidad de compilación donde se declara, esencialmente al prometer que alguien lo definirá en alguna parte.

También puede combinar extern con __attribute__((visibility("hidden"))) para crear un símbolo que se pueda usar fuera de su unidad de compilación, pero no fuera de su unidad de enlace, por así decirlo. Lo he usado para código de biblioteca y marco personalizado para encapsular adecuadamente los detalles internos de nivel superior.

+0

Hm .. Pero disminuye la legibilidad del código si el uso no está documentado en mayor medida. –

+0

¿Hay alguna manera de usar esto con una declaración de clase? (es decir, http://stackoverflow.com/questions/22798660/extern-with-class-in-objective-c) – Senseful

+0

También considere FOUNDATION_EXPORT ya que también funciona con código C++. http://stackoverflow.com/a/10953284/142358 –

10

Depende de para qué lo use. Es perfectamente válido para usarlo para acceder a constantes definidas globalmente.
Si tiene un objeto global, sin embargo, le sugiero que use Singleton.

15

Hay algunos casos de uso para la palabra clave extern en Objective-C.
Aaron Hillegass sugiere crear nombres de notificaciones globales extern. por ejemplo:

extern NSString* const XYYourNotification; 

A continuación se define el actual NSString* en su aplicación

+0

¿Dónde puedo encontrar más información sobre la sugerencia de Hillegass? ¿Conoces la URL? – Joshua

+1

Lo vi por primera vez en "Cocoa Programming for Mac OS X" (Aaron Hillegass). Uno de los mejores libros relacionados con el cacao que leí hasta ahora. http://www.bignerdranch.com/book/cocoa®_programming_for_mac®_os_x_3rd_edition –

+0

¿Por qué necesito usar extern? ¿No puedo simplemente declarar una variable estática? Gracias – aneuryzm

2

Depende de su necesidad, por ejemplo, tiene la página de inicio de sesión. Después de iniciar sesión, está notificando a otras páginas en las aplicaciones.

#import <Foundation/Foundation.h> 

extern NSString *const DidLoginNotification; 

@interface LoginViewController : NSObject 
- (void)login; 
@end 


// LoginViewController.m 
#import "LoginViewController.h" 

//define extern const in implementation file only once for the whole process 
NSString *const DidLoginNotification = 
    @"DidLoginNotificationNotified"; 

@implementation LoginViewController 

- (void)login { 
    // Perform notification 
    [[NSNotificationCenter defaultCenter]; 
    sendNotificationName: DidLoginNotification 
                    object:nil]; 
} 

La parte que recibe la notificación no necesita conocer el valor de la const.