objective-c - 将#define 与 [NSBundle mainBundle] 中的键组合的简单方法

标签 objective-c c ios xcode

在我的 iOS 应用程序中,我有两个目标及其自己的 .plist 文件:ProductionTest

我的应用程序使用了一堆不同的 URL,这些 URL 位于生产服务器或测试服务器上。因此,我在我的两个 plist 中添加了一个新 key ,如下所示:

<!-- MyAppTest-Info.plist -->
...
<key>MAServerURL</key>
<string>http://test.myap.com</string>
...

<!-- MyApp-Info.plist -->
...
<key>MAServerURL</key>
<string>http://myapp.com</string>
...

所以现在在我的 Const.h 中而不是定义特定的 urls #define IMAGEURL @"http://myapp.com/images/" 并在我想切换环境时更改它们

我现在可以这样做了:

// Const.h
#define SERVER_URL [[[NSBundle mainBundle] infoDictionary] objectForKey:@"MAServerURL"];

#define IMAGE_URL [NSString stringWithFormat:@"%@/images", SERVER_URL];
#define AUDIO_URL [NSString stringWithFormat:@"%@/audio", SERVER_URL];
#define FEEDBACK_URL [NSString stringWithFormat:@"%@/mail/feedback", SERVER_URL];
....

理论上这是可行的,但对于常量的每次访问,包都会被访问,并且在语法上它也不是真正的美(由于 OBJ-C 中的冗长连接)。

非常欢迎任何想法和建议。

最佳答案

extern 是你的 friend ...尝试了解它。

基本上,您在头文件中声明一个全局变量,使用 extern 修饰符,基本上意味着它的值稍后将在另一个源文件中定义。

所以你可以:

const.h

extern NSString * kAudioURL;

这只是将变量声明为 NSString 对象。 包括您的 const.h 文件在内的所有文件都将能够看到此变量,即使它实际上并未定义。

然后,您将在另一个(实现)文件中定义该变量。

const.m

NSString * kAudioURL = @"foo";

这样,定义将被隐藏,就像它发生在实现文件中一样,但其他文件将通过包含头文件来访问您的变量。

这样您就可以一次分配正确的值。

当然,在您的示例中,您使用的是计算值。由于 kAudioURL 是全局的,您将无法编写:

NSString * kAudioURL = [ NSString stringWithFormat: @"%@/images", SERVER_URL ];

但是您可以将初始值设置为 nil,并使用初始化函数,该函数可能会从您的应用程序的委托(delegate)中调用。

关于objective-c - 将#define 与 [NSBundle mainBundle] 中的键组合的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7531580/

相关文章:

iphone - 改变 CAShapeLayer 中的线宽

php - 检测用户平台

ios - 大小为零的 UIView 对象是否占用大量内存?

iphone - 我的应用程序中的消息服务

ios - NSOperation 依赖操作和依赖对象

ios - iPhone - 获取当前点的音频幅度

ios - iOS 中的稀疏图像匹配

android - 如何使用 JNI 从 Android native C++ 调用 PackageManager.hasSystemFeature?

c++ - 可以单独编译任何 .c 文件(也就是说,没有 main?)

javascript - session cookie asp.net c#