2011-03-05 36 views
1

好吧,我現在有很多問題,現在試圖讓initWithCoder:工作正確。我有一個被加載的nib文件,在我的應用程序委託中,我調用了unarchiveWithFile:與該nib相關聯的視圖控制器,現在我的應用程序崩潰了。我可以看到initWithCoder:被調用兩次,大概是從awakeFromNib:被調用一次,然後從我調用unarchiveWithFile開始:因爲視圖控制器符合NSCoding。但是現在無論是視圖加載還是按IBOutlet時都會崩潰。有什麼建議麼??initWithCoder:被nib和NSCoding調用!

編輯:下面是的initWithCoder代碼:

- (id)initWithCoder:(NSCoder *)coder { 
    [super initWithCoder:coder]; 
    [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]]; 
    return self; 
} 

我做的是解碼註釋的地圖視圖中的數組,但某處沿線此方法被調用兩次,然後崩潰。

+0

錯誤日誌說什麼? – Jensen2k 2011-03-05 03:38:13

+0

現在我所得到的是調試器說「EXC_BAD_ACCESS」 – evanskis 2011-03-05 03:40:03

回答

0

你可以嘗試

- (id)initWithCoder:(NSCoder *)coder { 
    if(self == nil) 
    { 
      [super initWithCoder:coder]; 
      [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]]; 
    } 
     return self; 
} 

我不知道這是否會工作。

+0

我認爲這種方法試圖在傷口粘上一個可憐的堅挺塑料,而不是修復傷口,可以這麼說! – occulus 2011-03-05 13:02:17

1

不要忘記把你的init方法中的零檢查。例如。您發佈的方法是比較正確的,如果你寫的是:

- (id)initWithCoder:(NSCoder *)coder { 
    if (self = [super initWithCoder:coder]) { 
     [[self mapView] addAnnotations:[[coder decodeObjectForKey:@"Annotations"] retain]]; 
    } 
    return self; 
} 

這不是你的問題的原因,但是。

是否有充分的理由讓你自己解除視圖控制器的存檔?如果你沒有做任何特別的事情,你可以依靠現有的機制來做到這一點。 UIViewController的init的默認實現會查找與您的視圖控制器具有相同名稱的nib,如果它存在,它會加載nib(通過initWithNibName)。

如果有需要存檔和存檔的數據,則可能它不應該是UIViewController的實際組成部分。也許在別處分解它?

+0

很高興得到關於爲什麼downvotes的一些反饋。 – occulus 2011-03-05 15:45:23

+0

我不知道爲什麼這會被拒絕,但是謝謝你,我會試着把它分解出去。 – evanskis 2011-03-05 16:42:00