Objective C - 静态变量和全局变量?

9
在我的名为Ad的类的.m文件中,我有3个静态字符串。
static NSString *AdStateDisabled = @"disable";
static NSString *AdStateExpired = @"expired";
static NSString *AdStateActive = @"active";

我可以在当前类中简单地使用这些静态变量,但我无法从任何其他类调用它们,有没有一种方法使这些静态变量成为全局变量? 例如,在我的视图控制器类中,我可以这样做。

//HomeViewController.m
if ([self.ad.state isEqual:Ad.AdStateDisabled])
{
     //do something
}
3个回答

19

您可以在HomeViewController.h头文件中添加以下声明,然后需要在任何想访问这些字符串的地方导入该文件。

//HomeViewController.h
extern NSString *AdStateDisabled;
extern NSString *AdStateExpired;
extern NSString *AdStateActive;
然后修改你的定义,删除 "static"。
//HomeViewController.m
NSString *AdStateDisabled = @"disable";
NSString *AdStateExpired = @"expired";
NSString *AdStateActive = @"active";

如果您不想让字符串的用户导入HomeViewController.h,那么您也可以在AdState.h中定义这些字符串,并将定义放入AdState.m中(并从HomeViewController.m中删除它们),此后字符串的用户只需要导入AdState.h即可使用这些字符串。


嘿,我之前做了一个Gist,虽然不兼容ARC,但是可以通过使用assign方法并指定强或弱引用在ARC中实际使用。它更接近于原始问题的要求:https://gist.github.com/darionco/03649feeee57f86fee3f - Dario

10

首先,移除static。在C和Objective-C中,静态变量和函数意味着它们仅对当前编译单元可见(更确切地说:只有你声明了静态变量的文件才能看到它)。

其次,你还需要在公共头文件中添加“extern”来声明与类相关的变量,就像类的一个头文件一样:

extern NSString *AdStateDisabled;

你可以在其他文件中使用它们,但是你不会像 "Ad.AdStateDisabled" 一样访问它们,而是直接作为 "AdStateDisabled"。


0
从外观上看,似乎您正在尝试为状态类型创建某种“基于字符串的枚举器”。很高兴地报告,Obj-C现在提供了很好的方法来实现这一点:
在您的头文件中添加以下声明:
typedef NSString *AdState NS_TYPED_ENUM;
extern AdState const AdStateDisabled;
extern AdState const AdStateExpired;
extern AdState const AdStateActive;

在.m文件中添加以下定义:
AdState const AdStateDisabled = @"disable"
AdState const AdStateExpired = @"expired";
AdState const AdStateActive = @"active";

然后,您可以使用这些常量,甚至可以使用for循环枚举它们等。您需要在每个源文件中导入此头文件,以便在其中使用这些常量,因此您可以为基础设施创建一些“common.h”头文件,并告诉目标将其用作“预编译头”或类似物。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接