Почему бы не использовать sortedArrayUsingComparator:
и не использовать регистр без учета регистра?Примерно так:
NSArray *sortedArray = [myArray sortedArrayUsingComparator:^(id o1, id o2) {
NSString *str1 = (NSString *)o1;
NSString *str2 = (NSString *)o2;
return [str1 compare:str2 options:NSCaseInsensitiveSearch];
}];
update
Для более сложных классов также можно использовать несколько полей сравнения:
NSArray *sortedArray = [myArray sortedArrayUsingComparator:^(id o1, id o2) {
MyClass *cl1 = (MyClass *)o1;
MyClass *cl2 = (MyClass *)o2;
NSComparisonResult result = [cl1.primaryString compare:cl2.primaryString options:NSCaseInsensitiveSearch];
if (result == NSOrderedSame) {
result = [cl1.secondaryString compare:cl2.secondaryString options:NSCaseInsensitiveSearch];
}
return result;
}];