Сведения о вопросе

ЧОВИД

09:03, 5th August, 2020

Теги

objective-c   cocoa   types    

В Cocoa вы предпочитаете NSInteger или int, и почему?

Просмотров: 487   Ответов: 5

NSInteger / NSUInteger -это Cocoa-определенные замены для обычных встроенных типов.

Есть ли какая-то польза от использования типов NS* над встроенными модулями? Что вы предпочитаете и почему? Являются ли NSInteger и int одинаковой шириной на 32-битных / 64-битных платформах?



  Сведения об ответе

LIZA

05:59, 8th August, 2020

Насколько я понимаю, это NSInteger и др. являются архитектурно безопасными версиями соответствующих типов C. В основном их размер варьируется в зависимости от архитектуры, но NSInteger, например, гарантированно содержит любой допустимый указатель для текущей архитектуры.

Apple рекомендует вам использовать их для работы с OS X 10.5 и далее, и Apple API:s будет использовать их, так что это определенно хорошая идея, чтобы войти в привычку использовать их. Они требуют немного большего набора текста, но кроме этого, кажется, нет никакой причины не использовать их.


  Сведения об ответе

lourence

06:06, 12th August, 2020

Проблемы квантования для 64-разрядной среды выполнения

В некоторых ситуациях могут быть веские причины использовать стандартные типы вместо NSInteger : "unexpected" объем памяти в 64-битной системе раздут.

Ясно, что если целое число равно 8 вместо 4 байт, то объем памяти, занимаемый значениями, удваивается. Однако, учитывая, что не каждое значение является целым числом, обычно не следует ожидать, что объем памяти вашего приложения удвоится. Однако способ распределения памяти в Mac OS X меняется в зависимости от объема запрашиваемой памяти.

В настоящее время, если вы просите 512 байт или меньше, malloc округляется до следующего кратного 16 байт. Однако если вы просите больше 512 байт, то malloc округляется до следующего кратного 512 (по крайней мере 1024 байта). Предположим тогда, что вы определяете класс, который-среди прочих-объявляет пять переменных экземпляра NSInteger , и что в 32-разрядной системе каждый экземпляр занимает, скажем, 272 байта. В 64-разрядной системе экземпляры теоретически потребовали бы 544 байта. Но из-за стратегии распределения памяти каждый из них фактически займет 1024 байта (почти четырехкратное увеличение). Если вы используете большое количество этих объектов, объем памяти вашего приложения может быть значительно больше, чем можно было бы ожидать в противном случае. Если бы вы заменили переменные NSInteger на переменные sint_32 , вы бы использовали только 512 байт.

Поэтому, когда вы выбираете, что использовать scalar, убедитесь, что вы выбрали что-то разумное. Есть ли какая-либо причина, по которой вам нужно значение больше, чем вам нужно в вашем 32-разрядном приложении? Использование 64-битного целого числа для подсчета количества секунд вряд ли потребуется...


  Сведения об ответе

PROGA

14:52, 15th August, 2020

64-битный код фактически является смыслом существования для NSInteger и NSUInteger; до 10.5 они не существовали. Эти два параметра просто определены как Long в 64-битном и как ints в 32-битном коде:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

Таким образом, используя их вместо более простых типов C, когда вы хотите размер 'bit-native'.

У CocoaDev есть еще кое-какая информация.


  Сведения об ответе

lool

15:18, 5th August, 2020

Я предпочитаю стандартные объявления стиля c, но только потому, что я переключаюсь между несколькими языками, и мне не нужно слишком много думать об этом, но похоже, что я должен начать смотреть на nsinteger


  Сведения об ответе

SKY

20:50, 18th August, 2020

Для импорта и экспорта данных в файлы или через сеть я использую UInt32, SInt64 и т. д...

Они гарантированно имеют определенный размер независимо от архитектуры и помогают в переносе кода на другие платформы и языки, которые также разделяют эти типы.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться