Все передается по значению в C, просто некоторые из этих значений являются указателями. Передача указателя позволяет вам просто передать «указатель» целевому объекту, а не самому объекту. Вы управляете объектом, следуя указателям; любой, кто держит указатель на тот же объект, увидит изменения, внесенные в него любым другим кодом.
Все объекты Objective C обрабатываются с помощью указателей, поэтому вы должны были увидеть изменения в своем примере массива. Например,
NSArray *myArray = ...;
id element = [myArray objectAtIndex:n];
element.foo = @"Bar";
// [[myArray objectAtIndex:n] foo] is now "Bar";
Какой у вас был тестовый код?