2010-03-15 122 views
0

這看起來是否正確,dataFilePath在磁盤上並且包含正確的數據,但MSMutable數組在initWithCoder之後不包含任何對象?我可能只是想念一些東西,但我想在繼續之前快速檢查一下。initWithCoder無法按預期工作?

-(id)initWithCoder:(NSCoder *)decoder { 
    self = [super init]; 
    if(self) { 
     [self setReactorCore:[decoder decodeObjectForKey:@"CORE"]]; 
    } 
    return self; 
} 

-(id)init { 
    self = [super init]; 
    if(self) { 
     if([[NSFileManager defaultManager] fileExistsAtPath:[self dataFilePath]]) { 
      NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]]; 
      NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 
      NSMutableArray *newCore = [[NSMutableArray alloc] initWithCoder:unArchiver]; 
      [self setReactorCore:newCore]; 
      [newCore release]; 
      [data release]; 
      [unArchiver release]; 
     } else { 
      NSMutableArray *newCore = [[NSMutableArray alloc] init]; 
      [self setReactorCore:newCore]; 
      [newCore release]; 
     } 
    } 
    return self; 
} 

EDIT_001

我想我知道我錯了,我NSData的存檔,然後試圖初始化我NSMutable陣列它。我將重新修改代碼併發布更新。

gary

回答

1

我很困惑你爲什麼這樣做。你通常不會自己撥打initWithCoder:。您向編碼器詢問其內容,併爲您創建對象。該方法的整個解碼部分應該是id archivedObject = [NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]],其中archivedObject大概是您在代碼中調用newCore的數組(我不知道該文件的內容,所以我只是從您寫的內容中猜測出來)。在這種情況下,你會想要mutableCopy它,因爲我不認爲NS * Archiver保留了可變性。

我也希望你不要期望你的文章頂部寫的initWithCoder:方法在這個NSArray未被存檔時被調用。

+0

謝謝查克,我沒有考慮保留可變性,我會去重新考慮我在做什麼。非常感謝。 – fuzzygoat 2010-03-15 17:32:50

0

「我也希望你不希望你的文章頂部寫的initWithCoder:方法在這個NSArray未被存檔時被調用。」

沒有用。你爲什麼不能寫出爲什麼不叫?由於

編輯: 事實上,如果你的數組中的對象實施NSCoding,initWithCoding叫上他們每個人,當你恢復你的陣列(恢復這裏意味着你調用[解碼器decodeObjectForKey:@「yourArray」] )。我實際上是在我自己的代碼中做這個。所以我認爲你寫的是假的!