Objective-C使用Dictionaries& C抛出NSInvalidArgumentException。数组

时间:2010-08-27 03:39:47

标签: objective-c arrays dictionary

我正在尝试按照教程并在我自己的代码中实现它。

这是我遇到的问题 -

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'

无论如何我觉得我遗漏了一些东西......如果我这样做请告诉我,我一定会很快回答。

2 个答案:

答案 0 :(得分:1)

根据您提供的代码,一切似乎都是正确的。问题可能在其他地方发生。

通常将选择器发送到错误实例的错误发生,因为原始对象已被释放,并且已在其位置分配了另一个类的新实例;所有的东西仍然有一个旧的deallocated实例的引用(在这种情况下,某些地方仍然认为NSString位于地址0x59b5760,但字符串已被解除分配,并且NSDictionary已在同一地址分配)。

如果使用NSZombieEnabled,运行时会用zombie对象替换已解除分配的对象,并且可以为您提供有关发生内存事故的更好线索。

仔细修改代码的其他部分,以确保代码的所有都遵循memory management rules。有时,只需要一次过度释放就会引起严重的头痛。

答案 1 :(得分:0)

您对错误所在位置的评论并不完全正确。将字典添加到数组不会导致无法识别的选择器异常。

您需要在调试器中运行代码,并设置中断Objective-C例外选项。这将为您提供发生异常的代码行。

原因是在某处过度释放,在这种情况下,dreamlax的答案应该可以帮助您找到问题,或者您只是从数据数组中取出一个对象,并假设它不是。< / p>