在Objective C中使用extern有多好? 它确实使某些部分的编码变得容易..但它不会破坏对象的方向吗?
答案 0 :(得分:57)
你会发现{C}框架中广泛使用extern
,并且很难找到一个令人信服的论据,即他们的OO被“宠坏了”。相反,Cocoa是封装良好的,只能通过extern暴露它必须的东西。全局定义的常量当然是最常见的用法,但不一定是唯一有效的用法。
IMO,使用extern
并不一定“破坏”面向对象。即使在OO中,也经常使用可从任何地方访问的变量。在Objective-C中,使用extern
是缺乏“类变量”(如Java中用static
声明的那些变量)的最常见的解决方法。它允许您扩展可以在其声明的编译单元之外引用符号的范围,主要是承诺它将由某人在某处定义。
您还可以将extern
与__attribute__((visibility("hidden")))
结合使用,以创建可在其编译单元外使用的符号,但不能在其链接单元之外使用,可以这么说。我已经将它用于自定义库和框架代码,以正确封装更高级别的内部细节。
答案 1 :(得分:16)
Objective-C中的extern
关键字有一些用例
Aaron Hillegass建议创建全局通知名称extern。
e.g:
extern NSString* const XYYourNotification;
然后,在实现中定义实际的NSString*
答案 2 :(得分:10)
这取决于你用它做什么。
使用它来访问全局定义的常量是完全有效的。
但是,如果你有一个全局对象,我建议改为使用Singleton。
答案 3 :(得分:3)
取决于您的需求,例如您有登录页面。登录后,您将通知应用程序中的其他页面。
#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的值。
答案 4 :(得分:2)
不使用extern
时的另一个问题示例:
假设您在头文件中有一个全局变量:
NSString *globalVar = @"Wonderful";
您可以通过导入该头文件在3个位置使用它。您的代码将无法编译,链接器抱怨您在代码中定义了3个重复符号。要解决这个问题,你有两种方法:
使用static
,在这种情况下,导入该标头的每个文件都将定义其单独的引用(并且更改一个字符串不会影响在其他文件中导入的其他字符串):
static NSString *globalVar = @"Wonderful";
在.h文件中使用extern
并在.m文件中定义它。这样只定义了一个引用,每个文件将使用相同的引用(更改反映在所有文件中):
extern NSString *globalVar; // in .h
NSString *globalVar = @"Wonderful"; // in .m
选择最适合的方法。