2010-08-27 49 views
1

我正試圖按照教程,並在我自己的代碼中實現它。Objective-C與字典和數組拋出NSInvalidArgumentException

這裏是我得到的問題 -

數據,心願和wishlistids都是NSMutableArrays。我知道這個問題發生在我嘗試將字典添加到數據數組的行中。看代碼:

- (void)setupWishlists:(NSString *)informationReturned 
{ 
    if(![informationReturned isEqualToString:@""]){ 
     //[data setArray:[informationReturned componentsSeparatedByString:@"."]]; //this works too, its an old method I kept just incase... this one has the raw combined wishlists name and id together. Here I attempt to split them. 

     NSMutableArray *temporaryArray = [NSMutableArray array]; 
     NSArray *rawArray = [informationReturned componentsSeparatedByString:@"."]; 
     for (NSString *item in rawArray) { 
      //so pretty much here we have the raw information that came back... remove the IDs 
      [temporaryArray setArray:[item componentsSeparatedByString:@","]]; 
      [wishlists addObject:[temporaryArray objectAtIndex:0]]; 
      [wishlistids addObject:[temporaryArray objectAtIndex:1]]; 
     } 
     //Initialize the array. 
     NSDictionary *myWishlistsDict = [NSDictionary dictionaryWithObject:[NSArray arrayWithArray:wishlists] forKey:@"My Wishlists"]; 

     [data addObject:myWishlistsDict]; //GETTING PROBLEM HERE!!! IF I COMMENT THIS LINE IT IS FINE 
    } 
    NSLog(@"Raw Wishlists Array: %@", [data description]); 
} 

而且我肯定的Alloc所有這些陣列等的功能,我相信這個人之前先運行。

data = [[NSMutableArray alloc] init]; 
wishlists = [[NSMutableArray alloc] init]; 
wishlistids = [[NSMutableArray alloc] init]; 

這是錯誤(在控制檯看到:

2010-08-26 19:53:47.598 LoginApp[7604:207] -[__NSCFDictionary isEqualToString:]: unrecognized selector sent to instance 0x59b5760 
2010-08-26 19:53:47.600 LoginApp[7604:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary isEqualToString:]: unrecognized selector sent to instance 0x59b5760' 

反正我覺得我漏掉了什麼......如果我沒請告訴我,我一定會很快回答

回答

0

你對你在哪裏得到錯誤的評論並不完全正確。向數組添加字典不會導致無法識別的選擇器異常。

您需要在調試器中運行Objective-C異常選項集中的中斷代碼。這會給你發生異常的代碼行。

原因是在某個地方發佈了過度版本,在這種情況下,dreamlax的回答應該可以幫助您找到問題,或者您只是簡單地從數據數組中取出一個對象,並假定它不是字符串。

+0

這就是我正在做的。從數組中取出一個對象並假定它是一個字符串:D謝謝! – 2010-08-27 20:27:14

1

從您所提供的代碼,一切似乎是正確的。這個問題可能在其他地方鋪設。

通常在選擇被髮送給錯誤的實例錯誤發生,因爲日e原始對象已被釋放,並且不同類的新實例已被分配到其位置;所有的時間仍然有一個對舊的釋放實例的引用(在這種情況下,某處仍然認爲NSString存在於地址0x59b5760處,但該字符串已被釋放,並且NSDictionary已分配到同一地址)。

如果使用NSZombieEnabled,則運行時將用殭屍對象替換釋放對象,並且可以爲您提供關於發生內存不測事件的更好線索。

仔細修改您的代碼的其他部分,以確保所有代碼都遵循memory management rules。有時候,只需要一次過度釋放就會導致嚴重的頭痛。