为长篇帖子提前道歉!我只是希望所有细节都可用。
在我目前的设置中(一些受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
答案 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会立即重置为它的初始定义。