2010-01-15 94 views
3

我有我的数据在一个NSDictionary对象,其中键是CGPoints转换为NSValues和对象是UIColors 。下面是我使用从字典返回一个对象的方法:在NSDictionary快速枚举失败与“[Waypoint countByEnumeratingWithState:对象:计数:]:无法识别的选择器发送到实例...”

- (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方法,在这同一类实现(天气):

+ (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在对循环(遍历所有路点),这全部在drawRect方法中。航点包含天气对象。

routeAnnotation.lineColor = [fromWaypoint.weather getTemperatureColor2]; 

当视图负载,drawRect方法被调用两次(I需要这个效果)。第一次一切都很好,但第二次只要代码到达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' 

现在我不知道该错误是如何在航点,因为它是一个的NSDictionary是我正在迭代。另外,我绝对不明白为什么需要另一次调用drawRect来迭代失败!

回答

6

你想上的按键在字典中是这样进行快速列举:

for(NSValue *key in [temperatureColorMap allKeys]) 

UPDATE
虽然我的建议,使意图更加清晰,这绝不是异常的原因,你看到了(我现在意识到NSDictionary实现了快速枚举,并且它必须位于键数组上)。

我现在认为它可能是一个内存错误,因为你正在autoreleasing字典(但它的静态引用没有被设置为零,当它被释放),但我不能重现异常,即使运行你的方法多次。

我的代码和你的代码之间唯一的区别是,我改变了调用RGB2UIColor到一个客观C方法的调用。
你没有提供它的实现,但我可以假设它能够返回一个合适的目标-C Uicolor对象吗?

+0

我认为你可能是对的,我仍然困惑于如何处理内存管理在某些情况下。我知道我必须发布temperatureColorMap,但我怎么知道什么时候不再需要它?我应该在哪里发送释放消息? – Leonard 2010-01-15 21:14:27

+0

通常,如果需要在另一个对象(如视图控制器)的生命周期内使用对象,则可以将其作为另一个对象的实例变量和/或属性(并将其释放到其他对象的dealloc中方法)。 – gerry3 2010-01-15 21:18:38

+0

我再次运行我的代码,我得到了一个BAD_EXEC错误 - 我很抱歉,我一定有些困惑。而不是autoreleasing temperatureColorMap我现在在for循环完成后,在getTemperatureColor2中手动释放它 - 所以这是代码中不再需要温度映射的地方。作品! 我熟悉处理实例变量,我通常不知道如何处理在代码中某处创建的对象,然后将其作为参数传递给某些其他类中的其他方法。 – Leonard 2010-01-15 22:06:56

3

我想了快速列举默认数组语法会自动地为NSDictionary工作:

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

然而,这似乎得到对象(的MyClass实例)键字典(NSString的实例)。由于在NSString上调用MyClass方法,我的应用程序崩溃。所以我结束了这样做:

for(MyClass* instance in [dictionary allValues]){ // (as opposed to 'allKeys') 
    // process instance here 
} 
相关问题