シングルトン自体でロードする必要がありますここではシングルを作成し、シングルトンにLvalを割り当て、次に新しいオブジェクトを作成し、その新しいオブジェクトにlvalを再割り当てします。シングルトン。言い換えれば、
//Set venue to point to singleton
Venue *venue = [Venue sharedVenue];
//Set venue2 to point to singleton
Venue *venue2 = [Venue sharedVenue];
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
//Set venue to unarchived object (does not change the singleton or venue2)
venue = [unarchiver decodeObjectForKey:@"Venue"];
[unarchiver finishDecoding];
あなたがしたいことは、sharedVenueでこれを処理します。人々はシングルトンを行うので、私はあなたが何をしているか確認することはできませんが、sharedVenueは現在、次のようになりますと仮定することができますいくつかの方法があります:
それはあなたがそれを変更したい場合であると仮定すると、
static Venue *gSharedVenue = nil;
- (Venue *) sharedVenue {
if (!gSharedVenue) {
gSharedVenue = [[Venue alloc] init];
}
return gSharedVenue;
}
グローバル裏にシングルトンをオブジェクトにロードします。
static Venue *gSharedVenue = nil;
- (Venue *) sharedVenue {
if (!gSharedVenue) {
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[data release];
gSharedVenue = [unarchiver decodeObjectForKey:@"Venue"];
[unarchiver finishDecoding];
[unarchiver release];
}
if (!gSharedVenue) {
gSharedVenue = [[Venue alloc] init];
}
return gSharedVenue;
}
明らかに、何らかの形でアーカイブされたオブジェクト・ファイルへの実際のパスを伝える必要があります。
EDIT COMMENTに基づく:
さて、あなたはアロケーションベースのシングルトンを使用している場合は、クラスでこの問題に対処する必要があるメソッドINIT:私はこれは間違っていると思うのはここ
- (id) init {
self = [super init];
if (self) {
NSData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[data release];
Venue *storedVenue = [unarchiver decodeObjectForKey:@"Venue"];
[unarchiver finishDecoding];
[unarchiver release];
if (storeVenue) {
[self release];
self = [storedVenue retain];
}
}
return self;
}
この答えは、私がそれの周りに私の頭を包むことができるのでちょうど私にはちょっと意味があります。もう一方のinitは正しく見えますが、概念化するのは少し難しいです。 – rob5408
偉大な答え...ちょうど参考に誰かがこの質問につまずいた場合、私はinitメソッドは、NSKeyedUnarchiverを使用する必要がありますと信じています。 – Bern11
ありがとう、スニペットを更新しました。 –