setObject:ForKey:崩溃?

时间:2011-08-28 03:40:04

标签: ios crash sigabrt

我在控制台中遇到了这个崩溃:

2011-08-27 23:26:45.041 App[1672:3117] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil key'
*** First throw call stack:
(0x3231c8c3 0x362ee1e5 0x3231c7bd 0x3231c7df 0x32289679 0x3052e865 0x3220fd55 0x3221b7a3 0x3345e4b7 0x3345e38c)
terminate called throwing an exception[Switching to process 10243 thread 0x2803]
[Switching to process 10243 thread 0x2803]

我认为在与此次崩溃相关的崩溃时唯一可以解雇的是这一行:

UIImage *photo = [self.selectedDictionary objectForKey:@"ProfileImage"];

这里看错了吗?可能是什么问题?

EDIT1: 当我这样做调用方法时崩溃: 代码:

if(actionSheet.tag == 1) {
            [self showAchievements];
        }

这是showAchievements方法: 代码:

- (void)showAchievements {
    GKAchievementViewController *achievements = [[GKAchievementViewController alloc] init];
    if (achievements != nil)
    {
        achievements.achievementDelegate = self;
        [self presentModalViewController:achievements animated:YES];
    }
}

- (void)achievementViewControllerDidFinish:(GKAchievementViewController *)viewController
{
    [self dismissModalViewControllerAnimated:YES];
    [viewController release];
}

这次崩溃是因为我没有正确地将所有内容挂钩到iTC中吗?我肯定肯定它在那种方法中崩溃了,我不知道为什么。

有没有人有任何想法?

Edit2:我在这里,在我的控制台中,在它崩溃之前它有一条线说错过方法。所以我搜索这个NSLog的位置,它在GameCenterManager.m中,我认为这是Game Center所必需的文件。这是方法:

    - (void) callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err
{
    assert([NSThread isMainThread]);
    if([delegate respondsToSelector: selector])
    {
        if(arg != NULL)
        {
            [delegate performSelector: selector withObject: arg withObject: err];
        }
        else
        {
            [delegate performSelector: selector withObject: err];
        }
    }
    else
    {
        NSLog(@"Missed Method");
    }
}

所以从那段代码中你看到什么错了?

谢谢!

2 个答案:

答案 0 :(得分:3)

我猜您的答案就在答案中:

reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil key'

您无法将nil键插入字典中。你在做[myDictionary setObject:foo forKey:bar],其中'bar'是零吗?

顺便说一句,您也无法将nil值插入字典中,但这似乎不是错误原因所指示的。你可以调用[myDictionary setValue:nil forKey:bar](只要bar不是nil) - 这会从字典中删除密钥。如果要指示“nil”值,可以将NSNull对象插入字典中。但是键 - 键必须总是是非零的。

答案 1 :(得分:1)

从日志中看起来,密钥profileImage等于nil,这意味着NSDictionary中没有该密钥的数据。