按照此链接:如何使用 NSKeyedArchiever 归档两个对象?我能够归档一个数组和一个单例对象。我可以在 didFinishLaunchingWithOptions 中归档和正确取消归档它。
但是,我的单例对象不会持续超过应用程序委托。在下一个视图控制器中,即使在 didFinishLaunchingWithOptions 中,我执行了 NSLog 并进行了验证,单例变量也会返回到其默认值。这是一个例子,
在应用中didFinishLaunchingWithOptions
:
Singleton *singleton = [Singleton sharedSingleton];
NSData *data = [NSData dataWithContentsOfFile:path];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
singleton = [unarchiver decodeObjectForKey:@"singleton"];
[unarchiver finishDecoding];
NSLog(@"singleton sorting after decode: %@", [singleton sort]);
// 输出:字母
然后,我分配/初始化一个 viewController 并将其设置为我的导航控制器的根视图控制器:
navController = [[UINavigationController alloc] initWithRootViewController:viewController];
在 viewController -> viewWillAppear 中,
我调用一个排序函数:[self sort...];
在排序函数中,我调用了单例类: Singleton*singleton = [Singleton sharedSingleton];
但是现在,NSLog(@"singleton sort: %@", [singleton sort]);
// 输出:amount NOT alphabet
我可以发布我的单例代码,但我知道它有效。事实上,在我的设置视图控制器中,如果我更改 [singleton sort] 变量,它将在所有视图控制器中持续存在。
这让我很困惑,为什么我的单例对象不会从应用程序委托持续到我的视图控制器。任何提示/提示表示赞赏。
谢谢!!!
编辑:单例类实现
在 Singleton.m 中:
static Singleton *shared = NULL;
+ (id)sharedSingleton
{
@synchronized(self)
{
if ( !shared || shared == NULL )
{
// allocate the shared instance, because it hasn't been done yet
NSLog(@"Allocating Singleton...");
shared = [[Singleton alloc] init];
}
return shared;
}
}
- (id)init
{
if ( self = [super init] )
{
sort = [[NSString alloc] initWithString:@"amount"];
showTutorial = YES;
}
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
[super init];
[self setSort:[aDecoder decodeObjectForKey:@"sort"]];
[self setShowTutorial:[aDecoder decodeBoolForKey:@"showTutorial"]];
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:sort forKey:@"sort"];
[aCoder encodeBool:showTutorial forKey:@"showTutorial"];
}