Как сказал Георг Фрицше, NSMutableArray передается автоматически, но не NSArray. Лучший вариант тоже посмотреть на код ниже:
void mutateImmutableArray(NSArray *array);
void mutateMutableArray(NSMutableArray *array);
void mutateImmutableArrayByRef(NSArray **array);
void mutateMutableArrayByRef(NSMutableArray **array);
int main(int argc, const char * argv[]) {
@autoreleasepool {
//Change immutable array in method that expects immutable array
NSArray *immutable = @[@1,@2,@3];
mutateImmutableArray(immutable);
NSLog(@"After 1: %@",immutable); // 1,2,3
//Change mutable array in method that expects immutable array
NSMutableArray *mutable = [@[@1,@2,@3]mutableCopy];
mutateImmutableArray(mutable);
NSLog(@"After 2: %@",mutable); //1,2,3
//Change mutable array in method that expects mutable array
mutable = [@[@1,@2,@3]mutableCopy];
mutateMutableArray(mutable);
NSLog(@"After 3: %@",mutable); //1,2,3, Four
//Change immutable array in method that expects immutable array by reference
immutable = @[@1,@2,@3];
mutateImmutableArrayByRef(&immutable);
NSLog(@"After 4: %@",immutable); //4,5,6
//Change mutable array in method that expects mutable array by reference
mutable = [@[@1,@2,@3]mutableCopy];
mutateMutableArrayByRef(&mutable);
NSLog(@"After 5: %@",mutable); //1,2,3, Four
}
return 0;
}
void mutateImmutableArray(NSArray *array)
{
array = @[@4,@5,@6];
}
void mutateImmutableArrayByRef(NSArray **array)
{
*array = @[@4,@5,@6];
}
void mutateMutableArray(NSMutableArray *array)
{
[array addObject:@"Four"];
}
void mutateMutableArrayByRef(NSMutableArray **array)
{
[*array addObject:@"Four"];
}