このリンクをたどる: NSKeyedArchiever を使用して 2 つのオブジェクトをアーカイブするにはどうすればよいですか? 配列とシングルトン オブジェクトをアーカイブできます。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]);
// 出力: 量 NOT アルファベット
Singleton コードを投稿できますが、動作することはわかっています。実際、ビュー コントローラーの設定で [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"];
}