1) вы указываете его связь.extern linkage позволяет вам или любому клиенту ссылаться на символ.
в отношении глобальных переменных: если переменная изменчива и / или нуждается в правильном построении, вам следует рассмотреть методы или функции для этого объекта.заметным исключением из этого являются константы NSString:
// MONClass.h
extern NSString* const MONClassDidCompleteRenderNotification;
// MONClass.m
NSString* const MONClassDidCompleteRenderNotification = @"MONClassDidCompleteRenderNotification";
2) не существует случая, когда ключевое слово extern влияет на видимость (public / protected / private / package).чтобы использовать символ (например, константу или функцию C), просто включите заголовок, в котором он объявлен.
несколько сбивает с толку, если вы новичок в языке: размещение внешних объявлений C (констант, функций) между @interface ... @end
не изменит свою область видимости:
@interface MONClass : NSObject
extern const size_t MaximumThreads;
@end
имеет ту же область видимости (глобальную) и видимость (общедоступную), что и:
@interface MONClass : NSObject
@end
extern const size_t MaximumThreads;
, поэтому действительно нет смысла размещать ваш класссвязанные константы C или функции в @interface...@end
и @implementation...@end
.я рекомендую поместить их в тот же заголовок, что и интерфейс, за пределами @interface/@end
и @implementation/@end
и добавить к имени префикс с классом, с которым он связан, например:
@interface MONClass : NSObject
@end
extern const size_t MONClassMaximumThreads;
// MONClass.m
const size_t MONClassMaximumThreads = 23;
и если вы хотите эту константучтобы быть приватным, просто объявите и определите это так:
// MONClass.m
static const size_t MONClassMaximumThreads = 23;
@implementation MONClass
@end
к сожалению, не существует столь же простого или распространенного способа сделать эту константу защищенной с помощью objc.
наконец, вы также можетеиспользуйте методы класса, если число должно варьироваться в зависимости от класса:
@interface MONMammal : NSObject
+ (NSUInteger)numberOfLegs;
@end
@implementation MONDog
+ (NSUInteger)numberOfLegs { return 4; }
@end
@implementation MONHuman
+ (NSUInteger)numberOfLegs { return 2; }
@end
3) да, среди других языков.например, если вы используете extern const int Something
в переводе c ++, перевод c ++ будет искать Something
, объявленный как внешний символ C ++.в объекте нет замены;objc является надмножеством C и наследует все функциональные возможности C.использование extern
правильно сформировано, и вы также можете найти его в используемых вами средах (например, Foundation).они используют его, потому что им нужно указать связь.objc не предлагает замену, предположительно потому, что для этого не требуется замена или расширение.
, чтобы избежать этого, просто используйте #define
, например:
#if !defined(__cplusplus)
#define MONExternC extern
#else
#define MONExternC extern "C"
#endif
MONExternC const size_t MONClassMaximumThreads;