2010-01-15 26 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 
} 
相關問題