цель c синтаксисом, приводящим NSNumber к int - PullRequest
0 голосов
/ 17 марта 2012

С точки зрения памяти и времени вычислений, лучше привести к значению int как:

int thisLetterInt = (int)[(NSNumber *)[levelSavedSolutionArrayFIX objectAtIndex:i] intValue];

или

int thisLetterInt = [[levelSavedSolutionArrayFIX objectAtIndex:i] intValue];

или это точно так же?

Кроме того, я не несу ответственности за освобождение в любом случае, верно?

Ответы [ 4 ]

6 голосов
/ 17 марта 2012

Преобразования не нужны, вы просто тратите место на жестком диске и циклы ЦП во время компиляции программы.

Даже с включенным ARC, компилятор знает, что для типа id (то, что возвращает -objectAtIndex:), наиболее вероятной сигнатурой метода для -intValue является i@: или метод, возвращающий целое число и принимающий 2 аргумента (self и _cmd).

Единственное место, где это могло бы изменить ситуацию, это если бы вы использовали точечный синтаксис, например.

int thisLetterInt = [levelSavedSolutionArrayFIX objectAtIndex:i].intValue; // compile error

Поскольку тип id не показывает какие-либо свойства компилятору, вы должны сначала привести его.

int thisLetterInt = ((NSNumber *)[levelSavedSolutionArrayFIX objectAtIndex:i]).intValue; // compiles fine

Что касается освобождения, то нет, примитивные типы выделяются в стеке, а не в куче, что означает, что они будут очищаться автоматически после выхода из текущей области.

1 голос
/ 17 марта 2012

Используйте второй подход. Это проще и код более читабелен. С точки зрения управления памятью, вы не несете ответственности за управление примитивными типами, такими как int, float, если вы не выделяете для них память, используя оператор «new», такой как int *arr = new int[50];.

0 голосов
/ 17 марта 2012

Вам не нужно кастинг, поэтому второе правильно.Вы просто тратите время процессора.В любом случае вы должны быть уверены, что levelSavedSolutionArrayFIX содержит элементы NSNumber.Если возможно получить другой тип в нем - вы получите сбой.Любой кастинг вам не поможет.

0 голосов
/ 17 марта 2012

Лично я думаю, что наиболее читаемый и безопасный способ - это сделать:

int thisLetterInt = [(NSNumber*)[levelSavedSolutionArrayFIX objectAtIndex:i] intValue];

Просто потому, что objectAtIndex возвращает id, и поэтому вы явно приводите к NSNumber*, поэтомуКомпилятор поможет вам, если, например, вы написали intValue неправильно, он предупредит.

Однако вам не нужно приводить к int, поскольку intValue возвращает int, поэтомуизбыточный.

С точки зрения памяти и времени вычислений - все эти методы во время выполнения будут совершенно одинаковыми.Так что разницы нет.Компилятору придется выполнять немного разные работы в каждом конкретном случае, но это будет настолько крошечным, что о нем не стоит беспокоиться.

И выпуск не требуется, нет.

...