3

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

我现在正在尝试枚举analyzedPxDictionaryusing 快速枚举。但是,似乎我无法从循环中访问 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]);

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

那么为什么我不能rgbforin循环内访问该属性呢?

4

1 回答 1

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]);
}
于 2011-10-17T15:50:13.127 回答