4

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

#import <Foundation/Foundation.h>
extern NSString *kMPTimeChanged;

@interface GlobalVariables : NSObject etc. 

然后在初始化中:

@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;
}

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

4

4 回答 4

17

在您的 .h 文件中,您应该编写:

extern NSString * const kMPTimeChanged;

在你的 .m 文件中,你应该写:

NSString * const kMPTimeChanged = @"My Constant";

这两个都应该在你的@interfaceand@implementation块之外。

于 2013-11-01T15:47:24.337 回答
4

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

// Globals.h
extern NSString * const kMPTimeChanged;

// Globals.m
NSString * const kMPTimeChanged = @"...";
于 2013-11-01T15:48:57.410 回答
0

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

#define kMPTimeChanged @"kMPTimeChanged"
于 2013-11-01T15:48:11.623 回答
0

我不喜欢extern变量。有时很难弄清楚它们来自哪里,我最终不得不在大型代码库中搜索名称不佳的变量,这些变量似乎无处不在。我想我有点在全局变量中是邪恶的人群。不过,它们很有用,所以我有自己的解决方案。

我的解决方案是一个简单Constants的类,包含一堆静态方法、属性,以及任何需要的东西(当然都是只读的)。问题是你被困在任何地方都导入这个类!不过,有一个简单的解决方案。

在您的项目中导入-Prefix.pch 文件。这将自动添加到您的所有代码中,您将能够使用您的常量并且仍然知道它们来自哪里而无需考虑它。

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

#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的来源。

于 2013-11-01T19:08:05.013 回答