3

キーが NSValues に変換された CGPoints であり、オブジェクトが UIColors である NSDictionary オブジェクトにデータがあります。辞書からオブジェクトを返すために使用しているメソッドは次のとおりです。

- (UIColor*) getTemperatureColor2 {
    NSDictionary* temperatureColorMap = [Weather getTemperatureColorMap];   

    for(id key in temperatureColorMap) {
        CGPoint point = [key CGPointValue];
        if ( (int)roundf(self.temperature_celsius) >= (int)roundf(point.x)  ) { 
            if ( (int) roundf(self.temperature_celsius) <= (int) roundf(point.y) ) {
                return [temperatureColorMap objectForKey:key];
            }
        }       
    }

    return [UIColor blackColor];    
}

これは getTemperatureColorMap メソッドで、同じクラス (Weather) に実装されています。

+ (NSDictionary*) getTemperatureColorMap {
    static NSDictionary* temperatureColorMap = nil;

    if (temperatureColorMap == nil) {
        temperatureColorMap = [[[NSDictionary alloc] initWithObjectsAndKeys:
                            RGB2UIColor(0x0E09EE), [NSValue valueWithCGPoint: CGPointMake(-99, -8)],
                            RGB2UIColor(0xB85FC), [NSValue valueWithCGPoint:  CGPointMake(-7, -3) ],
                            RGB2UIColor(0x0BDCFC), [NSValue valueWithCGPoint: CGPointMake(-2, 2) ],
                            RGB2UIColor(0x1BBA17), [NSValue valueWithCGPoint: CGPointMake(3, 7) ],
                            RGB2UIColor(0x45F90C), [NSValue valueWithCGPoint: CGPointMake(8, 12) ],
                            RGB2UIColor(0xF9F60C), [NSValue valueWithCGPoint: CGPointMake(13, 17) ],
                            RGB2UIColor(0xF9B20C), [NSValue valueWithCGPoint: CGPointMake(18, 22) ],
                            RGB2UIColor(0xF9780C), [NSValue valueWithCGPoint: CGPointMake(23, 27) ],
                            RGB2UIColor(0xFE3809), [NSValue valueWithCGPoint: CGPointMake(28, 32) ],
                            RGB2UIColor(0xFE0909), [NSValue valueWithCGPoint: CGPointMake(33, 99) ], nil] autorelease];
    }

    return temperatureColorMap;
}

getTemperatureColor2 を for ループ (すべてのウェイポイントを通過する) で呼び出します。これはすべて drawRect メソッドにあります。ウェイポイントには気象オブジェクトが含まれています。

routeAnnotation.lineColor = [fromWaypoint.weather getTemperatureColor2];

ビューが読み込まれると、drawRect メソッドが 2 回呼び出されます (効果のためにこれが必要です)。1 回目はすべて問題ありませんが、2 回目はコードが for ループの高速列挙に到達するとすぐに例外が発生します。

2010-01-15 11:40:42.224 AppName[1601:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Waypoint countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x856d170'

Waypoint は NSDictionary であるため、エラーがどのように発生するのかわかりません。また、繰り返しが失敗するために drawRect をもう一度呼び出す必要がある理由がまったくわかりません。

4

2 に答える 2

6

次のように、ディクショナリ内のキーに対して高速な列挙を実行します。

for(NSValue *key in [temperatureColorMap allKeys])

更新
私の提案は意図をより明確にしますが、それは間違いなくあなたが見ている例外の原因ではありません(NSDictionaryは高速列挙を実装しており、キーの配列になければならないことに気付きました)。

辞書を自動解放しているため、メモリエラーである可能性があると考えています(ただし、辞書への静的参照は解放時に nil に設定されません)が、メソッドを何度も実行しても例外を再現できません。

私のコードとあなたのコードの唯一の違いは、RGB2UIColor の呼び出しを Objective-C メソッドの呼び出しに変更したことです。
あなたはその実装を提供していませんが、適切な客観的な C UIColor オブジェクトを返すことができると思いますか?

于 2010-01-15T20:27:12.450 に答える
3

高速列挙のためのデフォルトの配列構文は、次の場合に自動的に機能すると思いましたNSDictionary

for(MyClass* instance in dictionary){  // <- this works for NSArray
    // process instance here
}

ただし、これはオブジェクト ( のインスタンス)辞書からのキー( のインスタンス) の両方を生成するようです。でメソッドが呼び出されたため、アプリがクラッシュしていました。だから私はこれをやった:MyClassNSStringMyClassNSString

for(MyClass* instance in [dictionary allValues]){ // (as opposed to 'allKeys')
    // process instance here
}
于 2013-05-16T08:45:31.477 に答える