Подтвердить что ты не робот

Добавление целого к NSMutableArray

Я не мог найти это нигде, поэтому я прошу только просить вас убедиться. И да, я знаю его основные, но я полагаю, что я предпочел бы получить это, прежде чем совершу ошибку миллион раз:

Если я сделаю следующее, то он по умолчанию добавит "0" к NSNumber (если нет, какой тип объекта он) или мне нужно будет сделать второй код?

(Или оба из них могут быть неправильными для того, что я пытаюсь сделать. Если да, дайте мне знать. Они оба компилируются, поэтому мне просто интересно, какой из них "правильный" (или предпочтительный) и почему.)

Код 1:

NSMutableArray array = [[[NSMutableArray alloc] init]];
[array addObject: 0];

Код 2:

NSMutableArray array = [[NSMutableArray alloc] init];
[array addObject: [NSNumber numberWithInt: 0]];
4b9b3361

Ответ 1

NSMutableArray не принимает примитивных типов.

Второй вариант правильный.

Ответ 2

Вы не можете поместить примитив, например int, в NSArray; вы должны создать экземпляр NSNumber, чтобы его удержать.

Если я делаю следующее, то он по умолчанию устанавливает "0" в NSNumber (если нет, какой тип объекта он)

Никакое кастинг не происходит. Невозможно просто "вставить" примитив в объект, а примитив не имеет типа объекта. Объекты должны быть построены путем отправки сообщений (за исключением: см. Ниже), что происходит во время выполнения; литье действует только во время компиляции.

Единственная причина, по которой это работает, заключается в том, что вы выбрали 0 для добавления в массив. Это то же значение, что и nil, что означает "нет объекта". Если вы выбрали какое-либо другое целое число, вы столкнулись бы с крахом на руках, когда вы запустили код, так как это значение будет использоваться как указатель на память, в котором не имеется допустимого объекта.

Интересно, что, начиная с Clang 3.1 или Apple LLVM 4.0, * есть некоторый новый синтаксический сахар для создания объектов из литералов в коде. У нас всегда был буквальный NSStrings: @"Lichtenstein". С новым компилятором другие объекты также могут быть созданы с использованием символа @.

В этом случае для создания объекта NSNumber из целого числа буквально вы можете просто написать:

[array addObject:@0];

* (пока недоступно в общедоступном Xcode)

Ответ 3

Как указано в предыдущих ответах, вы можете добавлять объекты (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