1) si sta specificando il suo collegamento. il collegamento esterno consente a te o a qualsiasi cliente di fare riferimento al simbolo.
relativo alle variabili globali: se la variabile è modificabile e/o richiede una costruzione corretta, è necessario considerare i metodi o le funzioni per questo oggetto. la notevole eccezione a questa è NSString costanti:
// MONClass.h
extern NSString* const MONClassDidCompleteRenderNotification;
// MONClass.m
NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";
2) non v'è alcun caso in cui la parola chiave extern colpisce visibilità (/ protetto/privato/pubblico di pacchetti). per utilizzare il simbolo (ad esempio la costante o la funzione C), includere semplicemente l'intestazione in cui è dichiarato.
un po 'di confusione se si è nuovi alla lingua: posizionando dichiarazioni C esternamente (costanti, funzioni) tra @interface ... @end
non sarà modificare il campo di applicazione:
@interface MONClass : NSObject
extern const size_t MaximumThreads;
@end
ha la stessa portata (globale) e la visibilità (pubblico) come:
@interface MONClass : NSObject
@end
extern const size_t MaximumThreads;
quindi ha davvero alcun senso mettere le costanti o funzioni C relative classe nel @[email protected]
e @[email protected]
. Mi raccomando mettendo questi nella stessa intestazione come l'interfaccia, al di fuori @interface/@end
e @implementation/@end
e anteponendo il nome con la classe cui è associato, in questo modo:
@interface MONClass : NSObject
@end
extern const size_t MONClassMaximumThreads;
// MONClass.m
const size_t MONClassMaximumThreads = 23;
e se si vuole che continua ad essere privata, a soli dichiarare e definire in questo modo:
// MONClass.m
static const size_t MONClassMaximumThreads = 23;
@implementation MONClass
@end
purtroppo, non c'è modo altrettanto semplice o comune per rendere questo costante protetto con objc.
, infine, è anche possibile utilizzare i metodi della classe se il numero dovrebbe variare per classe:
@interface MONMammal : NSObject
+ (NSUInteger)numberOfLegs;
@end
@implementation MONDog
+ (NSUInteger)numberOfLegs { return 4; }
@end
@implementation MONHuman
+ (NSUInteger)numberOfLegs { return 2; }
@end
3) Sì, tra le altre lingue. ad esempio, se si utilizza extern const int Something
in una traduzione C++, la traduzione C++ cercherà lo Something
dichiarato come simbolo C++ esterno. non vi è alcuna sostituzione in objc; objc è un superset di C ed eredita tutte le funzionalità di C. l'uso di extern
è ben strutturato e puoi trovarlo anche nei framework che utilizzi (ad es. Foundation). lo usano perché devono specificare il collegamento. objc non offre un sostituto, presumibilmente perché non ha richiesto una sostituzione o un'estensione.
per evitare questo, è sufficiente utilizzare un #define
come questo:
#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif
MONExternC const size_t MONClassMaximumThreads;
Objective-C è un superset di C. Quindi si applicano le parole chiave C. – Mat
buona domanda .. – Krishnabhadra
@ Mat so, ma il mio punto era: non è obiettivo-c che fornisce le proprie parole chiave per dichiarare metodi e variabili globali? – aneuryzm