关于C#:iOS:拥有全局字符串的最佳方法-关于通知名称

iOS: Best way to have a global string - as for a notification name

我一直在阅读与此有关的不同内容,这似乎很令人困惑。 有人可以告诉我正确的模式来定义可全局使用的通知字符串吗? 我尝试过的所有操作都导致了链接器错误。 例如,在我的GlobalVariables单例中,我添加了:

1
2
3
4
#import <Foundation/Foundation.h>
extern NSString *kMPTimeChanged;

@interface GlobalVariables : NSObject etc.

然后在init中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@implementation GlobalVariables

#pragma mark Singleton Methods

+ (id)sharedGlobals {
    static GlobalVariables *sharedGlobals = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedGlobals = [[self alloc] init];

    });
    return sharedGlobals;
}

- (id)init {
    if (self = [super init]) {

      kMPTimeChanged=@"kMPTimeChanged";

    return self;
}

它没有建立,我遇到了多个错误。


在您的.h文件中,您应该输入:

1
extern NSString * const kMPTimeChanged;

在您的.m文件中,您应该输入:

1
NSString * const kMPTimeChanged = @"My Constant";

这些都应该在@interface@implementation块之外。


我建议将变量声明为const extern。然后:

1
2
3
4
5
// Globals.h
extern NSString * const kMPTimeChanged;

// Globals.m
NSString * const kMPTimeChanged = @"...";


我不喜欢extern变量。有时很难弄清它们的来源,而我不得不在大型代码库中搜索命名错误的变量,这些变量似乎根本就不存在。我想我在全局变量中有些邪恶。它们仍然很有用,所以我有自己的解决方案。

我的解决方案是简单的Constants类,其中包含一堆静态方法,属性以及所需的任何内容(当然,它们都是只读的)。问题是您在任何地方都无法导入此类!不过,有一个简单的解决方案。

在您的project-Prefix.pch文件中导入。这将自动添加到您的所有代码中,您将可以使用常量,并且无需考虑常量就可以知道它们的来源。

这是我的project-Prefix.pch文件的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
#import <Availability.h>

#ifndef __IPHONE_5_0
#warning"This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>

    #import"Constants.h"
#endif

现在,您可以在任何地方访问Constants.serverUrl,并且仍然确切知道serverUrl的来源。


如果您的值是常量,则仅使用标头,例如称为Constants.h。在此标头中,您可以这样声明常量:

1
#define kMPTimeChanged @"kMPTimeChanged"