在目标C中使用extern

Gau*_*te 46 objective-c

在Objective C中使用extern有多好?它确实使某些部分的编码变得容易..但它不会破坏对象的方向吗?

Qui*_*lor 58

你会发现它extern在Cocoa框架中被广泛使用,并且很难找到一个令人信服的论据,即他们的OO被"宠坏了".相反,Cocoa是封装良好的,只能通过extern暴露它必须的东西.全局定义的常量当然是最常见的用法,但不一定是唯一有效的用法.

IMO,使用extern不一定"破坏"面向对象.即使在OO中,也经常使用可从任何地方访问的变量.在Objective-C中,使用extern是缺少"类变量"(如staticJava中声明的那些变量)的最常用的解决方法.它允许您扩展可以在其声明的编译单元之外引用符号的范围,主要是承诺它将由某人在某处定义.

您也可以结合extern使用__attribute__((visibility("hidden"))),以创建一个可以在其编译单元外部使用的符号,但没有以外的联动单位,可以这么说.我已经将它用于自定义库和框架代码,以正确封装更高级别的内部细节.


Tho*_*ing 16

externObjective-C中的关键字有一些用例.
Aaron Hillegass建议创建全局通知名称extern.例如:

extern NSString* const XYYourNotification;
Run Code Online (Sandbox Code Playgroud)

然后NSString*,您可以在实现中定义实际值

  • 如果你说"Objective-C中没有静态变量",那么这对我一直使用的静态关键字意味着什么呢? (4认同)

Vla*_*mir 10

这取决于你用它做什么.使用它来访问全局定义的常量是完全有效的.
但是,如果你有一个全局对象,我建议使用Singleton.


Ser*_*scu 7

不使用时出现问题的另一个示例extern

假设您在头文件中有一个全局变量:

NSString *globalVar = @"Wonderful";
Run Code Online (Sandbox Code Playgroud)

您可以通过导入该头文件在 3 个地方使用它。您的代码无法编译,链接器抱怨您的代码中定义了 3 个重复的符号。要解决它,您有两种方法:

使用static,在这种情况下,导入该标头的每个文件都将定义其单独的引用(并且更改一个字符串不会影响其他文件中导入的其他字符串):

static NSString *globalVar = @"Wonderful";
Run Code Online (Sandbox Code Playgroud)

extern在.h文件和.m文件定义它。这样只会定义一个引用,并且每个文件都将使用相同的引用(更改会反映在所有文件中):

extern NSString *globalVar; // in .h

NSString *globalVar = @"Wonderful"; // in .m
Run Code Online (Sandbox Code Playgroud)

选择最适合的方法。