1

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

我将首先为不想查看代码的任何人概述问题。

提前为长篇道歉!我只想提供所有详细信息。

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

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

1) 在单例类 (GlobalData) 中将 globalMessage 设置为“默认全局消息”。

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)

问题是,在第 6 步,控制台仍然打印“默认全局消息”

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

非常感谢您的帮助!

这是代码...

全球数据.h

#import <Cocoa/Cocoa.h>

@interface GlobalData : NSObject {
    NSString *globalMessage;
}

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

@end

全球数据.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

我的文档.h

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

@interface MyDocument : NSPersistentDocument {
}

@end

我的文档.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

输出图像。

4

1 回答 1

0

将 GlobalData.m 中的 sharedGlobalData 更改为

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

解决了我的问题。

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

于 2013-09-13T01:13:25.003 回答