NSLog(@"%@", [[dictionary objectForKey:[images objectAtIndex:i]] objectForKey:@"filename"]);
我得到所有空值。
从数组中获取密钥工作正常。 dictionary 没有您检索的键的对象,或者您检索的字典没有键 @"filename" 的对象。
我假设这是因为我的 [images objectAtIndex:i] 返回的不是字符串,但是我尝试在 (NSString *) 中进行 slappin 并且仍然得到空值。
首先,NSStrings 不是唯一有效的键。任何可复制对象都可用作字典键。
更重要的是,请记住,您永远不会直接使用对象结构,而是使用指向对象的指针。 objectAtIndex: 返回一个指向对象的指针;当你转换它的返回值时,你告诉编译器objectAtIndex: 将返回一个指向 NSString 对象的指针。转换指针不会改变指针本身;它只告诉编译器在该指针的另一端会发生什么。如果objectAtIndex: 正在返回指向 Foo 对象的指针,将它们强制转换为指向 NSString 对象的指针不会使它们指向 NSString 对象;它们仍将指向 Foo 对象,因此在键为字符串的字典中查找这些对象仍然会失败。
要考虑的另一件事是:您为什么不知道这个数组中有什么?您创建了数组。您填充了数组。那么,当然,你应该知道里面有什么。 objectAtIndex: 只返回(指向)数组中的对象。
如果您认为 objectAtIndex: 返回的对象不是有效的键,那么您应该使用 NSLog 或调试器检查数组。检查数组包含什么以及这些对象的类是什么。
更可能的是,该数组确实包含作为键有效但不是字典中的键的对象,或者它确实包含作为字典中的键的对象,但作为这些键的对象的字典不包含@"filename" 键。检查数组和外部字典。
另一个警告,这可能是什么让你绊倒:如果你在数组中保留 mutable 字符串,这些是你最初将字典插入到外部字典中的键,而你改变这些字符串,使它们与外部字典中的键不匹配。请记住,字典会复制它们的键(这就是键需要可复制的原因);你改变了你在数组中的字符串,但是字典之前做了一个副本,并且那个副本没有改变。 (这就是制作副本的意义:制作副本的人(在本例中为字典)希望保持对象原样,而不会收到以后发生的任何突变。)
因此,如果您想修改任何字符串,您必须在数组中替换它们并将旧键的外部字典对象存储在新键下。您还必须采取措施防止重复密钥;字典每个键只保存一个对象,而数组可以包含同一对象任意多次。