2012-04-23 24 views
0

我试图使用@字符作为NSDictionary中的键,我的应用程序只是崩溃。我搜索了“无效”键名,无法在任何地方找到@“@”。如果我使用@“@”以外的东西,它一切正常。@字符作为NSDictionary中的键

我有一个公约的列表,我得到每个公司的第一个字母,然后我创建一个NSMutableDictionary条目,其中包含第一个字母作为键和一个NSMutableArray作为值。

NSMutableDictionary indexDictionary = [[NSMutableDictionary alloc] init]; 

// here we have a loop on companyName 
{ 
NSString *fristLetter = [[companyName substringToIndex:1] uppercaseString]; 
NSMutableArray *arrayOfIndexedCompanies = [indexDictionary valueForKey:firstLetter]; 

    if (arrayOfIndexedCompanies) { 
     [arrayOfIndexedCompanies addObject:companyName] 
    } 
    else { 
     NSMutableArray *newArray = [NSMutableArray array]; 
     [indexDictionary setObject:newArray forKey:firstLetter]; 
     [newArray addObject:companyName]; 
    } 
} 

我启用了扔断点休息,它停靠在[indexDictionary valueForKey:firstLetter] ...只有当firstLetter是@ “@”。 我如果说有一个:

if ([firstLetter isEqualToString:@"@"]) { 
    firstLetter = @"A"; 
} 

并能正常工作,它正确地放置@首发公司的A部分。如果我让第一个信件保持不变(将其保留为@“@”),则应用程序将崩溃。

此外,这不是我的代码,我只是想解决它,我不是很熟悉ObjC和Foundation,所以请温和。

+0

有什么问题吗? – Jasper 2012-04-23 13:04:18

+0

我试图找出是否有其他人有同样的问题,有没有办法逃避/解决这个问题,并使用@作为关键? – andrei 2012-04-23 13:08:03

+0

然后把这个问题。 (虽然跳过“其他人经历过这个”部分,因为这里不是真正的问题)另外,你为什么想要? – Jasper 2012-04-23 13:10:08

回答

4

Read the documentation :)

具体来说,该位:

如果键不以“@”开头,则调用objectForKey :.如果键确实以“@”开头,则删除“@”并用其余键调用[super valueForKey:]。

我想这super valueForKey:不乐意被称为:)

为了解决这个问题,只需拨打objectForKey:代替valueForKey:

+0

这就是它!非常感谢你 ! – andrei 2012-04-23 14:06:51

1

使用字符串@"@"的字典重点工作就好了:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"Test 1", @"@", @"Test 2", @"Another @", nil]; 
NSString *result = [dict objectForKey:@"@"]; 
NSLog(@"%@", result); 
// --> Test 1 
0

你可以给一个尝试@ “\ u0040”

+0

尝试用@“\ u0040”替换@“@”,它仍然失败。它应该是相同的字符:) – andrei 2012-04-23 13:46:54