如何使用singleton类方法更改全局变量的值?

时间:2013-09-12 17:01:42

标签: objective-c global-variables singleton-methods

我希望能够从任何改变全局变量值的类调用方法。

我将首先概述那些不希望查看代码的人的问题。

为长篇帖子提前道歉!我只是希望所有细节都可用。

在我目前的设置中(一些受SREE博客启发的测试代码),我有一个单例类(GlobalData),它定义了一个全局变量(globalMessage)和一个改变全局变量的方法(globalFunction)。 p>

到目前为止,我的代码......

1)在单例类(GlobalData)中将globalMessage设置为“Default Global Message”。

2)使用NSLog在另一个类(MyDocuments)中打印“Outside class:'Default Global Message'”。

3)使用另一个类(MyDocuments)调用globalFunction。

4)globalFunction将globalMessage设置为“New Global Message”

5)globalFunction使用NSLog(@"Set %@", globalMessage)输出“设置新的全局消息”

6)重复步骤2. NSLog(@"Outside class: %@", [GlobalData sharedGlobalData].globalMessage)

The issue is, on step 6, the console still prints "Default Global Message"

当我调用globalFunction时,我只更改实例变量globalMessage而不是全局变量。

非常感谢您的帮助!

这是代码......

GlobalData.h

#import <Cocoa/Cocoa.h>

@interface GlobalData : NSObject {
    NSString *globalMessage;
}

@property (retain) NSString *globalMessage;
+ (GlobalData*)sharedGlobalData;
+(void)globalFunction;

@end

GlobalData.m

#import "GlobalData.h"

@implementation GlobalData
@synthesize globalMessage;
static GlobalData *sharedGlobalData=nil;

+(GlobalData*)sharedGlobalData{
    if (sharedGlobalData==nil) {
        sharedGlobalData = [[super allocWithZone:NULL]init];
    }

    sharedGlobalData.globalMessage=@"Default Global Message";
    return sharedGlobalData;
    }

+(void)globalFunction{
    sharedGlobalData.globalMessage=@"New Global Message";
    NSLog(@"Set %@",sharedGlobalData.globalMessage);
}

@end

MyDocuments.h

#import <Cocoa/Cocoa.h>
#import "GlobalData.h"

@interface MyDocument : NSPersistentDocument {
}

@end

MyDocuments.m

#import "MyDocument.h"

@implementation MyDocument

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

    NSLog(@"Outside class: '%@'",
          [GlobalData sharedGlobalData].globalMessage);
    NSLog(@"Outside class setting new message...");
    [GlobalData globalFunction];
    NSLog(@"Outside class: '%@'",
          [GlobalData sharedGlobalData].globalMessage);
    return self;
}

- (NSString *)windowNibName 
{
    return @"MyDocument";
}

@end

Image of output.

1 个答案:

答案 0 :(得分:0)

将GlobalData.m中的sharedGlobalData更改为

+(GlobalData*)sharedGlobalData{
    if (sharedGlobalData==nil) {
        sharedGlobalData = [[super allocWithZone:NULL]init];
        sharedGlobalData.globalMessage=@"Default Global Message";
    }
    return sharedGlobalData;
}

解决了我的问题。

我不知道为什么,但是sharedFlobalData总是在globalFunction之后调用,所以我的globalMessage会立即重置为它的初始定义。