2012-10-25 47 views
1

下面是我用取消歸檔數據的代碼:崩潰而實施NSCoding協議方法釋放

- (id)initWithCoder:(NSCoder *)decoder 
{ 
    if((self = [super init])) 
    { 
     NSString *resoureItemClassName = NSStringFromClass([ResourceItem class]); 
     self.selectedItemClassName=[decoder decodeObjectForKey:@"selectedItemClassName"]; 
     Class class = NSClassFromString(selectedItemClassName); 
     id temp = nil; 

     if(class) 
     {  
      temp = [[class alloc] init]; 
     } 

     if(temp) 
     { 
      if([temp isKindOfClass:[NSString class]]) 
      { 
       self.selectedString = [decoder decodeObjectForKey:@"selectedString"];; 
       self.ID = selectedString; 
      } 
      else if([selectedItemClassName isEqualToString:resoureItemClassName]) 
      { 
       DLog(@"Resource item") 
      } 

      [temp release];       
     } 
     else 
     {  
      self.ID = nil; 
     } 
    } 

    return self; 
} 

當我鬆開tempObject,應用程序崩潰。如果我不這樣做,這是一個泄漏。我嘗試使用autorelease方法。它仍然墜毀?解決辦法是什麼?

UPDATE:

在selectedItemClassName的編碼數據或者是__NSCFConstantString或__NSCFString。崩潰只發生在__NSCFString而不是__NSCFConstantString作爲類名稱,

可能是什麼原因?

+0

什麼是崩潰的對象的類型?它會一直崩潰嗎?在發佈之前打印一個'[temp className]' – Alexander

+0

它是__NSCFString – Krishnan

+0

同樣的問題不會發生在__NSCFConstantString – Krishnan

回答

0

如何:

- (id)initWithCoder:(NSCoder *)decoder 
{ 
    if((self = [super init])) 
    { 
     NSString *resourceItemClassName = NSStringFromClass([ResourceItem class]); 
     self.selectedItemClassName=[decoder decodeObjectForKey:@"selectedItemClassName"]; 
     Class class = NSClassFromString(selectedItemClassName); 

     if(class) 
     {  
      NSString *stringClassName = NSStringFromClass([NSString class]); 
      if([stringClassName isEqualToString:self.selectedItemClassName]) 
      { 
       self.selectedString = [decoder decodeObjectForKey:@"selectedString"];; 
       self.ID = selectedString; 
      } 
      else if([self.selectedItemClassName isEqualToString:resourceItemClassName]) 
      { 
       DLog(@"Resource item") 
      } 
     } 
     else 
     {  
      self.ID = nil; 
     } 
    } 

    return self; 
}