我正在尝试按照教程并在我自己的代码中实现它。
这是我遇到的问题 -
data,wishlists和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]);
}
此外,我确信在我确定要在此之前运行的函数中分配所有这些数组等。
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 :(得分:1)
根据您提供的代码,一切似乎都是正确的。问题可能在其他地方发生。
通常将选择器发送到错误实例的错误发生,因为原始对象已被释放,并且已在其位置分配了另一个类的新实例;所有的东西仍然有一个旧的deallocated实例的引用(在这种情况下,某些地方仍然认为NSString位于地址0x59b5760,但字符串已被解除分配,并且NSDictionary已在同一地址分配)。
如果使用NSZombieEnabled
,运行时会用zombie对象替换已解除分配的对象,并且可以为您提供有关发生内存事故的更好线索。
仔细修改代码的其他部分,以确保代码的所有都遵循memory management rules。有时,只需要一次过度释放就会引起严重的头痛。
答案 1 :(得分:0)
您对错误所在位置的评论并不完全正确。将字典添加到数组不会导致无法识别的选择器异常。
您需要在调试器中运行代码,并设置中断Objective-C例外选项。这将为您提供发生异常的代码行。
原因是在某处过度释放,在这种情况下,dreamlax的答案应该可以帮助您找到问题,或者您只是从数据数组中取出一个对象,并假设它不是。< / p>