在 Objective C 中使用 extern

问题描述 投票:0回答:5

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

objective-c
5个回答
62
投票

你会发现

extern
在 Cocoa 框架中被广泛使用,并且很难找到一个令人信服的论据来证明他们的 OO 被“破坏”了。相反,Cocoa 封装得很好,只暴露它必须暴露的内容,通常是通过 extern 来暴露。全局定义的常量当然是最常见的用法,但不一定是唯一有效的用法。

IMO,使用

extern
并不一定会“破坏”面向对象。即使在面向对象中,也经常使用可从任何地方访问的变量。使用
extern
是 Objective-C 中缺少“类变量”(如 Java 中使用
static
声明的变量)的最常见解决方法。它允许您扩展引用符号的范围,超出声明该符号的编译单元,本质上是通过承诺它将由某人在某个地方定义。

您还可以将

extern
__attribute__((visibility("hidden")))
组合起来创建一个可以在其编译单元之外使用的符号,但不能在其链接单元之外使用,可以这么说。我已将其用于自定义库和框架代码,以正确封装更高级别的内部细节。


16
投票

Objective-C 中的

extern
关键字有一些用例。
Aaron Hillegass 建议创建全局通知名称 extern。 例如:

extern NSString* const XYYourNotification;

然后您在实现中定义实际的

NSString*


10
投票

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


10
投票

这是不使用

extern
时出现问题的另一个示例:

假设你的头文件中有一个全局变量:

NSString *globalVar = @"Wonderful";

您尝试通过导入该头文件在三个地方使用它。您的代码无法编译,链接器抱怨您定义了三个重复的符号。

要解决此问题,有两种选择:

要么使用

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

static NSString *globalVar = @"Wonderful";

或者在

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

extern NSString *globalVar; // in .h

NSString *globalVar = @"Wonderful"; // in .m

选择最适合的方法。


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的值。

© www.soinside.com 2019 - 2024. All rights reserved.