在目标C中使用extern

时间:2009-12-22 13:10:31

标签: objective-c

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

5 个答案:

答案 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

选择最适合的方法。