На основании этой ссылки here возможно, что под обложками для общих NSNumbers существует какая-то оптимизация (что может не произойти во всех реализациях, поэтому возможная причина, по которой @ dizy's keepCount равен 1).
В основном, поскольку NSNumbers не изменяются, базовый код может предоставить вам вторую копию того же номера, которая объясняет, почему счетчик удержания равен двум.
Каков адрес n и n1? Я подозреваю, что они такие же.
NSNumber* n = [[NSNumber alloc] initWithInt:100];
NSLog(@"Count of n : %i",[n retainCount]);
NSNumber* n1 = n;
NSLog(@"Count of n : %i",[n retainCount]);
NSLog(@"Count of n1: %i",[n1 retainCount]);
NSLog(@"Address of n : %p", n);
NSLog(@"Address of n1: %p", n1);
Основываясь на вашем обновлении, эта ссылка, которую я вам дал, почти наверняка является проблемой. Кто-то проверил тест и выяснил, что NSNumbers от 0 до 12 предоставят вам дубликаты уже созданных (они могут быть созданы платформой даже до того, как пользователь их запросит). Другие выше 12, казалось, дают сохранить кол 1. Цитирование:
С немного экзамена я был в состоянии сделать, это выглядит, как если бы вы получите «общие» версию целочисленных NSNumbers для значений в диапазоне [0-12]. Все, что больше 12, дает вам уникальный экземпляр, даже если значения равны. Почему двенадцать? Нет подсказки. Я даже не знаю, тяжело ли это или косвенное.
Попробуйте с помощью 11, 12 и 13 - Я думаю, вы обнаружите, что 13 - это первый, который предоставит вам неосновный NSNumber.
Это очень странно, результат в моем xcode равен 2. следующий код скопирован из моего xcode: NSNumber * n = [[NSNumber alloc] initWithInt: 11]; \t NSNumber * n1 = n; \t NSLog (@ "% i", [n retainCount]); – Jiang