According to NSArray class reference there are 4 type of methods to sort array:
1-  sortedArrayUsingComparator:
2-  sortedArrayUsingSelector:
3-  sortedArrayUsingFunction:context:
4-  sortedArrayUsingDescriptors:
For first three methods it mentioned :
    The new array contains references to the receiving array’s elements, not copies of them.
But for the forth method (descriptor) it mentioned:
   A copy of the receiving array sorted as specified by sortDescriptors.
But following example shows like the other 3 methods, descriptor also retain original array and do not return a new copy of it:
NSString *last = @"lastName";
NSString *first = @"firstName";
NSMutableArray *array = [NSMutableArray array];
NSDictionary *dict;
NSMutableString *FN1= [NSMutableString stringWithFormat:@"Joe"];
NSMutableString *LN1= [NSMutableString stringWithFormat:@"Smith"];
NSMutableString *FN2= [NSMutableString stringWithFormat:@"Robert"];
NSMutableString *LN2= [NSMutableString stringWithFormat:@"Jones"];
dict = [NSDictionary dictionaryWithObjectsAndKeys: FN1, first, LN1, last, nil];
[array addObject:dict];
dict = [NSDictionary dictionaryWithObjectsAndKeys: FN2, first, LN2, last, nil];
[array addObject:dict];
// array[0].first = "Joe"    ,  array[0].last = "Smith"  
// array[1].first = "Robert" ,  array[1].last = "Jones" 
NSSortDescriptor *lastDescriptor =[[NSSortDescriptor alloc] initWithKey:last
                                                          ascending:YES
                                 selector:@selector(localizedCaseInsensitiveCompare:)];
NSSortDescriptor *firstDescriptor =[[NSSortDescriptor alloc] initWithKey:first
                                                           ascending:YES
                                 selector:@selector(localizedCaseInsensitiveCompare:)];
NSArray *descriptors = [NSArray arrayWithObjects:lastDescriptor, firstDescriptor, nil];
NSArray *sortedArray = [array sortedArrayUsingDescriptors:descriptors];
//    array[1] == sortedArray[0] == ("Robert" ,  "Jones")     
//    comparing array entries whether they are same or not:
NSLog(@"  %p  , %p " , [array objectAtIndex:1]  , [sortedArray objectAtIndex:0]  );
//  0x10010c520  ,  0x10010c520
it shows objects in both arrays are same,
 
     
    