访问const NSString变量

时间:2013-06-26 18:02:05

标签: objective-c cocoa-touch nsstring const

我尝试在类中定义const NSString。

我做了以下事情:

.h:

中的

#import <Foundation/Foundation.h>

@interface GlobalDataModel : NSObject

@property (nonatomic, strong) NSMutableDictionary *infoDictionary;

+ (id)sharedDataModel;

extern NSString * const WS_URL;

@end
.m:

中的

#import "GlobalDataModel.h"

@implementation GlobalDataModel

static GlobalDataModel *sharedInstance = nil;

NSString * const WS_URL = @"http://localhost:57435/IosService.asmx";


- (id)init{
    self = [super init];
    if (self) {
        self.infoDictionary = [NSMutableDictionary dictionary];
    }

    return self;
}

+ (id )sharedDataModel {
    if (nil != sharedInstance) {
        return sharedInstance;
    }
    static dispatch_once_t pred;        // Lock
    dispatch_once(&pred, ^{             // This code is called at most once per app
        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
}

@end

用法:

#import "GlobalDataModel.h"

GlobalDataModel *model = [GlobalDataModel sharedDataModel];

现在,我可以做到

NSString *temp = model.infoDictionary[@"xxx"];

但不是

NSString *temp = model.WS_URL

因为intellisense中没有WS_URL。

2 个答案:

答案 0 :(得分:1)

这就是为什么NSString * constNSString const *不同的类型,因此编译器会重新定义WS_URL

修改

如果你认为你已经以这种方式宣布了一个常数,那么你可以做一些像

这样的事情
#import "GlobalDataModel.h"
.
.
GlobalDataModel *model = [GlobalDataModel new];
model.WS_URL;
.

你错了,不可能:我建议你改用 readonly属性来返回那个常量。

所以,试试这样的事情

// GlobalDataModel.m
static NSString * const kURL = @"http://localhost:57435/IosService.asmx";
.
.
- (NSString *)WS_URL
{
    return [NSString stringWithString:kURL];
}

// GlobalDataModel.h
.
.
@property (nonatomic, readonly) NSString *WS_URL;
.

答案 1 :(得分:0)

您可以使用具有以下常量的模块:

Constants.h:

extern NSString * const WS_URL;

Constants.m

#import "Constants.h"   

NSString * const WS_URL = @"blabla";
在Module.m中

#import "Constants.h"

...

NSString* str = [NSString stringWithFormat: @"blabla=%@", WS_URL];