Bạn cần thực hiện tải trong bản thân những gì đang diễn ra ở đây là bạn tạo đĩa đơn, bạn gán một giá trị cho singleton, sau đó bạn tạo một đối tượng mới và gán lại giá trị cho đối tượng mới. singleton. Nói cách khác:
//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];
Điều bạn muốn làm là giải quyết vấn đề này trong sharedVenue. Có một vài cách mọi người làm độc thân, vì vậy tôi không thể chắc chắn những gì bạn đang làm, nhưng cho phép giả định sharedVenue hiện trông giống như sau:
static Venue *gSharedVenue = nil;
- (Venue *) sharedVenue {
if (!gSharedVenue) {
gSharedVenue = [[Venue alloc] init];
}
return gSharedVenue;
}
Giả sử đó là trường hợp bạn muốn thay đổi nó để tải đối tượng vào bản sao lưu toàn cầu singleton:
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;
}
Rõ ràng bạn cần truyền đạt đường dẫn thực tế đến tệp đối tượng đã lưu trữ.
EDIT DỰA VÀO BÌNH:
Được rồi, nếu bạn đang sử dụng dựa singleton alloc bạn cần để đối phó với điều này trong các lớp init phương pháp:
- (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;
}
Nguồn
2009-07-18 23:30:10
Câu trả lời này có ý nghĩa hơn một chút với tôi, chỉ vì tôi có thể quấn đầu quanh nó. Của người khác init có vẻ đúng nhưng khó hơn một chút để khái niệm hóa. – rob5408
Câu trả lời tuyệt vời ... chỉ là một FYI trong trường hợp bất cứ ai tình cờ khi câu hỏi này, tôi tin rằng phương pháp init nên sử dụng một NSKeyedUnarchiver. – Bern11
Cảm ơn, đã cập nhật đoạn mã. –