ultima tutorial programaciĆ³n objective logo lenguaje ejemplos caracteristicas objective-c c extern globals

objective-c - tutorial - objective c vs swift



3 preguntas sobre el uso externo en un proyecto de Objective-C (3)

1) Estás especificando su vinculación. La vinculación externa le permite a usted oa cualquier cliente hacer referencia al símbolo.

con respecto a las variables globales: si la variable es mutable y / o necesita una construcción adecuada, debe considerar los métodos o funciones para este objeto. La notable excepción a esto son las constantes NSString:

// MONClass.h extern NSString* const MONClassDidCompleteRenderNotification; // MONClass.m NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";

2) no hay ningún caso en el que la palabra clave externa afecte la visibilidad (público / protegido / privado / paquete). para usar el símbolo (por ejemplo, la función constante o C), simplemente incluya el encabezado en el que se declara.

algo confuso si eres nuevo en el lenguaje: colocar declaraciones C externas (constantes, funciones) entre @interface ... @end no alterará su alcance:

@interface MONClass : NSObject extern const size_t MaximumThreads; @end

Tiene el mismo alcance (global) y visibilidad (público) que:

@interface MONClass : NSObject @end extern const size_t MaximumThreads;

así que realmente no tiene sentido colocar las constantes o funciones de C relacionadas con la clase en @interface...@end y @implementation...@end . Recomiendo colocarlos en el mismo encabezado que en la interfaz, fuera de @interface/@end y @implementation/@end y prefijar el nombre con la clase con la que está asociado, así:

@interface MONClass : NSObject @end extern const size_t MONClassMaximumThreads; // MONClass.m const size_t MONClassMaximumThreads = 23;

y si desea que esa constante sea privada, simplemente declare y defínala de la siguiente manera:

// MONClass.m static const size_t MONClassMaximumThreads = 23; @implementation MONClass @end

desafortunadamente, no existe una manera igualmente simple o común de hacer que esta constante esté protegida con objc.

por último, también puede usar métodos de clase si el número varía según la 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 declarado como un símbolo externo de C ++. no hay sustitucion 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 el enlace. objc no ofrece un sustituto, probablemente porque no requirió un reemplazo o una extensión.

para evitar esto, simplemente use una #define como esta:

#if !defined(__cplusplus) #define MONExternC extern #else #define MONExternC extern "C" #endif MONExternC const size_t MONClassMaximumThreads;

  1. Cuando uso la palabra extern antes de una declaración de método o variable, ¿la estoy convirtiendo en global y, por lo tanto, legible / escribible / utilizable en todo el proyecto?

  2. Si uso extern antes de una palabra clave, ¿existe alguna posibilidad de que no sea accesible por parte de mi proyecto? Por ejemplo, solo por subclases ... como cuando uso "protegido".

  3. extern es una palabra clave C, ¿verdad? ¿Hay un equivalente en Objective-C? En realidad no entiendo por qué usan una palabra clave C en un proyecto Objective-C.

Gracias


Punto 3: Sí, puede usar FOUNDATION_EXPORT en el objetivo C, que es una macro que se resuelve con una palabra clave diferente dependiendo de si compila C o C ++

Más información aquí sobre las diferencias: "FOUNDATION_EXPORT" vs "extern"


extern no significa "global", significa "definido en otro lugar". Se utiliza para decirle al compilador que existe una variable o función (en otro archivo de objeto o biblioteca), para que no se queje de ello y que el enlazador reciba ese archivo de objeto o biblioteca.

Como consecuencia, extern implica que el elemento de destino es global.

Objective-C es solo un superconjunto de C. Todo lo que está disponible en C también está disponible en Objective-C, con la misma sintaxis y semántica. No hay constructo de C que se defina de otra manera en Objective-C.