Ответ 1
NSMutableArray
не принимает примитивных типов.
Второй вариант правильный.
Я не мог найти это нигде, поэтому я прошу только просить вас убедиться. И да, я знаю его основные, но я полагаю, что я предпочел бы получить это, прежде чем совершу ошибку миллион раз:
Если я сделаю следующее, то он по умолчанию добавит "0" к NSNumber (если нет, какой тип объекта он) или мне нужно будет сделать второй код?
(Или оба из них могут быть неправильными для того, что я пытаюсь сделать. Если да, дайте мне знать. Они оба компилируются, поэтому мне просто интересно, какой из них "правильный" (или предпочтительный) и почему.)
Код 1:
NSMutableArray array = [[[NSMutableArray alloc] init]];
[array addObject: 0];
Код 2:
NSMutableArray array = [[NSMutableArray alloc] init];
[array addObject: [NSNumber numberWithInt: 0]];
NSMutableArray
не принимает примитивных типов.
Второй вариант правильный.
Вы не можете поместить примитив, например int
, в NSArray
; вы должны создать экземпляр NSNumber
, чтобы его удержать.
Если я делаю следующее, то он по умолчанию устанавливает "0" в NSNumber (если нет, какой тип объекта он)
Никакое кастинг не происходит. Невозможно просто "вставить" примитив в объект, а примитив не имеет типа объекта. Объекты должны быть построены путем отправки сообщений (за исключением: см. Ниже), что происходит во время выполнения; литье действует только во время компиляции.
Единственная причина, по которой это работает, заключается в том, что вы выбрали 0
для добавления в массив. Это то же значение, что и nil
, что означает "нет объекта". Если вы выбрали какое-либо другое целое число, вы столкнулись бы с крахом на руках, когда вы запустили код, так как это значение будет использоваться как указатель на память, в котором не имеется допустимого объекта.
Интересно, что, начиная с Clang 3.1 или Apple LLVM 4.0, * есть некоторый новый синтаксический сахар для создания объектов из литералов в коде. У нас всегда был буквальный NSStrings
: @"Lichtenstein"
. С новым компилятором другие объекты также могут быть созданы с использованием символа @
.
В этом случае для создания объекта NSNumber
из целого числа буквально вы можете просто написать:
[array addObject:@0];
* (пока недоступно в общедоступном Xcode)
Как указано в предыдущих ответах, вы можете добавлять объекты (id
type) в классы контейнеров, такие как NSArray
.
Один класс, который может быть полезен в этом контексте, - это NSValue
, который служит контейнером для не-объектов данных типа C и objective-C. В дополнение к числовым типам данных это может также содержать структуры и некоторые примитивные типы данных objective-C типа NSRect
.
За дополнительной информацией обращайтесь: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html