使用包含 NSDictionary 的 NSMutableArray 进行快速枚举

Posted

技术标签:

【中文标题】使用包含 NSDictionary 的 NSMutableArray 进行快速枚举【英文标题】:Fast Enumeration With an NSMutableArray that holds an NSDictionary 【发布时间】:2010-02-19 23:14:08 【问题描述】:

是否可以对包含 NSDictionary 的 NSArray 使用快速枚举?

我正在浏览一些 Objective C 教程,下面的代码将控制台踢到 GDB 模式

NSMutableArray *myObjects = [NSMutableArray array];
NSArray *theObjects = [NSArray arrayWithObjects:@"easy as 1",@"easy as two", @"Easy as Three"];
NSArray *theKeys    = [NSArray arrayWithObjects:@"A",@"B",@"C"];    
NSDictionary *theDict = [NSDictionary dictionaryWithObjects:theObjects forKeys:theKeys];
[myObjects addObject:theDict];

for(id item in myObjects)

    NSLog(@"Found an Item: %@",item);

如果我用传统的计数循环代替快速枚举循环

int count = [myObjects count];
for(int i=0;i<count;i++)

    id item;
    item = [myObjects objectAtIndex:i];
    NSLog(@"Found an Item: %@",item);

应用程序运行没有崩溃,并且字典被输出到控制台窗口。

这是快速枚举的限制,还是我错过了一些微妙的语言?嵌套这样的集合时还有其他问题吗?

为了加分,我怎么能用 GDB 自己调试呢?

【问题讨论】:

【参考方案1】:

哎呀! arrayWithObjects: 需要零终止。以下代码运行良好:

NSMutableArray *myObjects = [NSMutableArray array];
NSArray *theObjects = [NSArray arrayWithObjects:@"easy as 1",@"easy as two", @"Easy as Three",nil];
NSArray *theKeys    = [NSArray arrayWithObjects:@"A",@"B",@"C",nil];    
NSDictionary *theDict = [NSDictionary dictionaryWithObjects:theObjects forKeys:theKeys];
[myObjects addObject:theDict];

for(id item in myObjects)

    NSLog(@"Found an Item: %@",item);

我不确定为什么使用传统循环会隐藏此错误。

【讨论】:

啊,我最喜欢的 Cism 之一。 “你认为正常工作的事情不应该是”。感谢新手的建议! 如果开启 -Wformat(Xcode 中的“Typecheck calls to printf/scanf”),编译器会对此发出警告。如果你还开启了 -Werror(Xcode 中的“Treat Warnings as Errors”),编译器会因为这个错误导致编译失败。

以上是关于使用包含 NSDictionary 的 NSMutableArray 进行快速枚举的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSDictionary 填充 UITableView,其中包含来自 mysql db 的已解析 JSON 数据

如何序列化包含 NSNull 的 NSDictionary/NSArray/Property List (plist)

使用具有多个值的键创建 NSDictionary

将包含 NSArray 的 NSDictionary 转换为 JSON

在 NSDictionary 中达到最深的儿童级别

哪种检查 NSDictionary 是不是包含特定键的方法更快?