keysSortedByValueUsingSelector falla pero sortedArrayUsingSelector funciona bien

Encontré una solución, pero aún bash comprender el problema.

Creé un campo de text Autocompletar con el uso de uitableview que está oculto hasta que se edita el campo de text. La parte UI funciona bien. Es la búsqueda de la parte de resultados que es el problema. Declaro un NSMutableDictionary local para almacenar mis resultados porque quería que los resultados fueran orderados por los valores de la key.

si llamo directamente a keysSortedByValueUsingSelector en el dictionary, se bloquea. Sin embargo, si obtengo las keys por [dictar todoTeclas] primero, luego invoco sortedArrayUsingSelector, funciona bien:

// This commented out line will crash // NSArray *sortedKeysArray = [dict keysSortedByValueUsingSelector:@selector(compare:)]; // The next two lines runs fine. NSArray *keyArray = [dict allKeys]; NSArray *sortedKeysArray = [keyArray sortedArrayUsingSelector:@selector(compare:)]; 

Aquí está el código fuente completo del método de búsqueda:

 - (void)searchAutocompleteEntriesWithSubstring:(NSString *)substring { // Put anything that starts with this substring into the autocompleteUrls array // The items in this array is what will show up in the table view [autocomplete_symbol_array removeAllObjects]; rRSIAppDelegate *appDelegate = (rRSIAppDelegate *)([[UIApplication shanetworkingApplication] delegate]); NSString *input_str = [substring uppercaseString]; NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; int i = 0; for(SymbolInfo *symbol_info in appDelegate.m_symbol_info_array) { i++; NSString *info_str = [[[symbol_info.m_symbol uppercaseString] stringByAppendingString:@"|"] stringByAppendingString:[symbol_info.m_company_name uppercaseString]]; NSUInteger pos = [info_str rangeOfString:input_str].location; if (pos != NSNotFound) { int tmp = pos * 10000 + i; NSNumber *map_key = [[NSNumber alloc] initWithInt:tmp]; [dict setObject:symbol_info forKey:map_key]; } } // This commented out line will crash // NSArray *sortedKeysArray = [dict keysSortedByValueUsingSelector:@selector(compare:)]; // The next two lines runs fine. NSArray *keyArray = [dict allKeys]; NSArray *sortedKeysArray = [keyArray sortedArrayUsingSelector:@selector(compare:)]; for (NSNumber *key in sortedKeysArray) { SymbolInfo *symbol_info = [dict objectForKey:key]; [autocomplete_symbol_array addObject:symbol_info]; } // NSLog(@"everything added: %d", [autocomplete_symbol_array count]); [autocompleteTableView reloadData]; } 

El método NSMutableDictionary es:

 - (void)setObject:(id)anObject forKey:(id < NSCopying >)aKey; 

Esto significa que la key debe implementar el protocolo NSCopying .