枚举NSMutableDictionary - 无法从循环内访问对象属性

时间:2011-10-17 15:42:05

标签: objective-c ios cocoa-touch for-in-loop fast-enumeration

我有一个NSMutableDictionary,analyzedPxDictionary,包含一堆Pixel对象(我创建的自定义类)。除此之外,Pixel对象包含一个名为rgb的NSArray属性。该数组将始终包含三个NSNumber对象,其整数值对应于像素的rgb值。

我现在尝试使用快速枚举来枚举analyzedPxDictionary。但是,似乎我无法从循环内访问Pixel对象的属性。我已将rgb声明为合成属性,以便我可以使用点语法访问它。但是当我尝试在循环中执行此操作时,程序崩溃,给出了如下错误:

'-[NSCFString rgb]: unrecognized selector sent to instance 0xa90bb50'

以下是产生该错误的代码示例:

for (Pixel *px in analyzedPxDictionary) {
    printf("r: %i, g: %i, b: %i",[[px.rgb objectAtIndex:0] integerValue], [[px.rgb objectAtIndex:1] integerValue], [[px.rgb objectAtIndex:2] integerValue]);
}

我尝试在printf行设置一个断点,以便检查px。虽然rgb在其属性中被列为一个并且被正确描述为NSArray的实例,但它似乎不包含任何对象。

我相信我正确地初始化rgb。要解释一下,请考虑以下代码:

NSString *key;
for (Pixel *px in analyzedPxDictionary) {
    key = [px description];
}

Pixel *px = [analyzedPxDictionary objectForKey:key];
printf("\nr: %i, g: %i, b: %i",[[px.rgb objectAtIndex:0] integerValue], [[px.rgb objectAtIndex:1] integerValue], [[px.rgb objectAtIndex:2] integerValue]);

这会成功将正确的值打印到控制台。

那么为什么我无法从rgb循环中访问forin属性?

1 个答案:

答案 0 :(得分:6)

NSDictionaries的快速枚举为您提供了每个键,而不是每个值。所以你需要这样做:

for (NSString *key in analyzedPxDictionary) 
{
    Pixel *px = [analyzedPxDictionary objectForKey:key];
    printf("r: %i, g: %i, b: %i",[[px.rgb objectAtIndex:0] integerValue], [[px.rgb objectAtIndex:1] integerValue], [[px.rgb objectAtIndex:2] integerValue]);
}