NSArray * sortedKeys = [[names allKeys] sortedArrayUsingSelector:@selector(compare:)];
El código anterior devuelve una matriz ordenada de las teclas del diccionario utilizando el selector que proporcione. El selector es realmente la función que se llamará al objeto que se está ordenando en su matriz. En este caso, la matriz contiene cadenas por lo que en el código real NSArray clasificar de la siguiente estaría pasando,
//...
[key1 compare:key2];
//..
Si pasa en un selector diferente digamos @selector (randomFunction :) a continuación en el código de clasificación sería la siguiente suceder
//..
[key1 randomFunction:key2];
//..
Dado que NSString no responde al selector randomFunction, se obtendría un error. Si quisiera crear su propio tipo de función de comparación, necesitaría agregar una categoría a la clase que contiene la matriz (en su caso, una categoría de NSString).
Una mejor forma de ordenar una matriz es usar una instrucción de bloque.
id mySort = ^(NSString * key1, NSString * key2){
return [key1 compare:key2];
};
NSArray * sortedKeys = [[names allKeys] sortedArrayUsingComparator:mySort];
La razón por la que es una mejor manera de clasificar cualquier objeto es muy fácil de hacer.
id mySort = ^(MyObject * obj1, MyObject * obj2){
return [obj1.title compare:obj2.title];
};
NSArray * sortedMyObjects = [myObjects sortedArrayUsingComparator:mySort];
+1 - buena explicación – bryanmac