При создании NSArray с объектами, это действительно указатель на массив указателей. Это означает, что когда вы проходите объект, объект не выделен снова, на самом деле он сохраняет ссылку. Это означает, что если вы передаете изменяемый объект в массив (например, NSMutableString и т. Д.), То вы добавите что-то в строку, массив изменит его значение. Если вы, с другой стороны, снова инициализируете объект, с другим значением, адрес памяти изменяется для этого объекта, но массив сохраняет ссылку на старый объект - это означает, что есть два разных объекта. Лучше, чтобы увидеть это на примерах:
Пример 1:
NSString *testString = @"Test";
NSArray *testArray = @[testString];
testString = @"Test2";
Здесь мы создаем неизменный объект и передать его в массив. Допустим, testString имеет адрес 0x1, testArray 0x99. Когда мы передаем литерал в testString, его не более чем выделяем, а затем инициализируем эту строку. Это значит, что перераспределит память, а затем адрес будет другим, например. 0x2. Массив все еще имеет ссылку на 0x1. 2 разных объекта.
Пример 2:
NSMutableString *testString = [NSMutableString stringWithString:@"Test"];
NSArray *testArray = @[testString];
[testString appendString:@"2"];
Здесь мы создаем изменяемый объект. Допустим, что он имеет адрес 0x1, адрес массива 0x2. Когда мы добавляем строку, адрес не изменяется. Зачем? Потому что при создании изменчивых строковых компиляторов вы измените его размер, поэтому он выделяет больше, чем вам нужно в этот конкретный момент. Добавление чего-то не изменит его адрес. Когда мы меняем testString, мы также изменяем значение строки в массиве. 1 объект вместо 2 разных.
Пример 3:
NSMutableString *testString = [NSMutableString stringWithString:@"Test"];
NSArray *testArray = @[testString];
testString = [NSMutableString stringWithString:@"Test2"];
Здесь мы имеем изменяемый объект, переданный в массив. Опять же скажем, что это 0x1, массив 0x2. Что здесь другое? Мы фактически не меняем строку, мы возвращаем память, передавая литерал, даже если это изменчивая строка. Это означает, что при передаче литерала адрес памяти изменился на 0x3, но массив все еще сохраняет 0x1.
FYI Объект, определенный вами в setObjectRef, не такой, как вы заявили в aFile. –