在 Objective C 中使用 extern 有多好? 它确实使某些部分的编码变得容易......但它不会破坏面向对象吗?
你会发现
extern
在 Cocoa 框架中被广泛使用,并且很难找到一个令人信服的论据来证明他们的 OO 被“破坏”了。相反,Cocoa 封装得很好,只暴露它必须暴露的内容,通常是通过 extern 来暴露。全局定义的常量当然是最常见的用法,但不一定是唯一有效的用法。
IMO,使用
extern
并不一定会“破坏”面向对象。即使在面向对象中,也经常使用可从任何地方访问的变量。使用 extern
是 Objective-C 中缺少“类变量”(如 Java 中使用 static
声明的变量)的最常见解决方法。它允许您扩展引用符号的范围,超出声明该符号的编译单元,本质上是通过承诺它将由某人在某个地方定义。
您还可以将
extern
与 __attribute__((visibility("hidden")))
组合起来创建一个可以在其编译单元之外使用的符号,但不能在其链接单元之外使用,可以这么说。我已将其用于自定义库和框架代码,以正确封装更高级别的内部细节。
Objective-C 中的
extern
关键字有一些用例。extern NSString* const XYYourNotification;
然后您在实现中定义实际的
NSString*
这取决于你用它做什么。
使用它来访问全局定义的常量是完全有效的。
但是,如果您有一个全局对象,我建议使用 Singleton 代替。
这是不使用
extern
时出现问题的另一个示例:
假设你的头文件中有一个全局变量:
NSString *globalVar = @"Wonderful";
您尝试通过导入该头文件在三个地方使用它。您的代码无法编译,链接器抱怨您定义了三个重复的符号。
要解决此问题,有两种选择:
要么使用
static
,在这种情况下,导入该标头的每个文件都将定义其单独的引用(并且更改一个字符串不会影响其他文件中导入的其他字符串),
static NSString *globalVar = @"Wonderful";
或者在
extern
文件中使用.h
并在.m
文件中定义它。这样,将只定义一个引用,并且每个文件将使用相同的引用(更改会反映在所有文件中),
extern NSString *globalVar; // in .h
NSString *globalVar = @"Wonderful"; // in .m
选择最适合的方法。
取决于您的需要,例如您有登录页面。登录后,您将通知应用程序中的其他页面。
#import <Foundation/Foundation.h>
extern NSString *const DidLoginNotification;
@interface LoginViewController : NSObject
- (void)login;
@end
// LoginViewController.m
#import "LoginViewController.h"
//define extern const in implementation file only once for the whole process
NSString *const DidLoginNotification =
@"DidLoginNotificationNotified";
@implementation LoginViewController
- (void)login {
// Perform notification
[[NSNotificationCenter defaultCenter];
sendNotificationName: DidLoginNotification
object:nil];
}
通知接收方不需要知道const的值。