【问题标题】:iOS: Best way to have a global string - as for a notification nameiOS:拥有全局字符串的最佳方式 - 至于通知名称
【发布时间】:2013-11-01 15:44:51
【问题描述】:

我一直在阅读有关此的不同内容,这似乎很危险。有人可以告诉我定义可以全局使用的通知字符串的正确模式吗?我尝试过的一切都导致了链接器错误。例如,在我的 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;
}

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

【问题讨论】:

标签: ios objective-c cocoa-touch global-variables


【解决方案1】:

在你的 .h 文件中你应该写:

extern NSString * const kMPTimeChanged;

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

NSString * const kMPTimeChanged = @"My Constant";

这两个都应该在您的 @interface@implementation 块之外。

【讨论】:

  • 我会补充一点,使用这个简单的解决方案不需要类(除非它用于其他目的)。只要有这两行就可以了。
【解决方案2】:

我建议您将变量声明为 const extern。那么:

// Globals.h
extern NSString * const kMPTimeChanged;

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

【讨论】:

  • 请参阅this post,了解const NSString *NSString const * 之间的区别。 NSString 类型的对象已经是不可变的,因此无需像您一样使用 const
  • @Neal 是的。错字。我修好了。
【解决方案3】:

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

#define kMPTimeChanged @"kMPTimeChanged"

【讨论】:

  • #define 很好用也很简单,我承认我经常使用它,但通常我想要我的数据类型。
  • @DBD:“想要我的数据类型”是什么意思?
  • const 是类型安全的,但 #define 替换发生在编译之前(基本上就像搜索和替换),因此您可以将 @"fubar" 更改为 37。它很可能会在以后引起问题,但你不会知道。如果您尝试使用 const 执行此操作,它会在您完成输入之前警告您。
  • 这对我有用,很容易声明常量:) @Linuxios
【解决方案4】:

我不喜欢 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 的确切来源。

【讨论】:

    猜你喜欢
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2015-12-18
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多