Причина в том, что [[NSArray alloc] init] возвращает один и тот же объект независимо от того, сколько раз вы его вызываете.Посмотрите на этот код:
NSArray *array1 = [[NSArray alloc] init];
NSArray *array2 = [[NSArray alloc] init];
NSArray *array3 = [[NSArray alloc] init];
NSLog(@"\narray1: %p\narray2: %p\narray3: %p",
array1, array2, array3);
Вывод:
array1: 0x10010cae0
array2: 0x10010cae0
array3: 0x10010cae0
Это имеет смысл, поскольку NSArray является неизменным, а все пустые массивы идентичны.Похоже, NSArray поддерживает пустой массив для этой цели, поскольку счетчик сохранения для массива, на который указывают array1, array2 и array3, равен 4.
Я не согласен с ответом @ fluchtpunkt, но думаюможно с уверенностью сказать, что мы точно знаем, почему это происходит.Полагаю, вы могли бы сказать, что никто точно не знает, почему Apple решила реализовать его таким образом, но это кажется хорошей идеей.