1) que está especificando su vinculación. El enlace externo le permite a usted o a cualquier cliente hacer referencia al símbolo.
con respecto a variables globales: si la variable es mutable y/o necesita una construcción adecuada, entonces debe considerar métodos o funciones para este objeto. la notable excepción a esto es NSString constantes:
// MONClass.h
extern NSString* const MONClassDidCompleteRenderNotification;
// MONClass.m
NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";
2) no hay ningún caso en el que la palabra clave extern afecta a la visibilidad (/ protected/privada/pública paquete). para utilizar el símbolo (por ejemplo, la función constante o C), simplemente incluya el encabezado en el que está declarado.
algo confuso si es nuevo en el lenguaje: colocar declaraciones C externas (constantes, funciones) entre @interface ... @end
no de alterar su alcance:
@interface MONClass : NSObject
extern const size_t MaximumThreads;
@end
tiene el mismo alcance (global) y visibilidad (público) como:
@interface MONClass : NSObject
@end
extern const size_t MaximumThreads;
por lo que realmente no tiene sentido para colocar sus relacionadas con la clase constantes o funciones de C en el @[email protected]
y @[email protected]
. te recomiendo estos puntos el mismo encabezado como la interfaz, fuera @interface/@end
y @implementation/@end
y anteponiendo el nombre de la clase que se asocia con, así:
@interface MONClass : NSObject
@end
extern const size_t MONClassMaximumThreads;
// MONClass.m
const size_t MONClassMaximumThreads = 23;
y si quieres que la constante de estar privada, a declarar y definir así:
// MONClass.m
static const size_t MONClassMaximumThreads = 23;
@implementation MONClass
@end
por desgracia, no hay manera igualmente simple o común para hacer esta constante protegido con objc.
por último, también se pueden utilizar métodos de la clase si el número debe variar por clase:
@interface MONMammal : NSObject
+ (NSUInteger)numberOfLegs;
@end
@implementation MONDog
+ (NSUInteger)numberOfLegs { return 4; }
@end
@implementation MONHuman
+ (NSUInteger)numberOfLegs { return 2; }
@end
3) Sí, entre otros idiomas. por ejemplo, si usa extern const int Something
en una traducción de C++, la traducción de C++ buscará Something
declarada como un símbolo externo de C++. no hay sustitución en objc; objc es un superconjunto de C y hereda todas las funcionalidades de C. el uso de extern
está bien formado y también puede encontrarlo en los marcos que usa (por ejemplo, Foundation). lo usan porque necesitan especificar un enlace. objc no ofrece un sustituto, presumiblemente porque no requiere un reemplazo o extensión.
Para evitar esto, sólo tiene que utilizar un #define
así:
#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif
MONExternC const size_t MONClassMaximumThreads;
Objective-C es un superconjunto de C. Entonces se aplican las palabras clave C. – Mat
buena pregunta .. – Krishnabhadra
@Mat Lo sé, pero mi punto era: ¿no es objetivo c proporcionar sus propias palabras clave para declarar los métodos y las variables globales? – aneuryzm