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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
47
0
23 947
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

64-битная версия - это на самом деле смысл существования NSInteger и NSUInteger; до 10.5 их не было. Два просто определены как long в 64-битной версии и как int в 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, когда вам нужен «битовый» размер.

У CocoaDev есть дополнительная информация.

Ссылка больше не доступна.

Akshit Zaveri 24.10.2013 16:51

Похоже, что в новом CocoaDev на данный момент нет этой статьи.

Sören Kuklau 24.10.2013 20:32

Да, это не так ... и в будущем, пожалуйста, не размещайте ссылки ... если возможно, отправьте ответ здесь. Публикация только ссылки противоречит правилам ответа stackoverflow.

Akshit Zaveri 24.10.2013 22:37
Ответ принят как подходящий

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

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

Это не обязательно так - см. Мой ответ «Проблемы с юантизацией для 64-битной среды выполнения».

mmalc 14.10.2008 05:09

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

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

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

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

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

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

Да, но статистически более продуктивно отвлекать программистов от битов и байтов. Мы говорим о Cocoa, а не о libc. С другой стороны, на iPhone у вас может быть точка, в зависимости от приложения.

IlDan 16.07.2009 05:14

Непонятно, в чем проблема: мои комментарии относятся непосредственно к Какао, и это важное соображение, когда вы выбираете тип для представления переменной. Тот факт, что вы используете Cocoa, не означает, что вам никогда не нужно учитывать факторы, связанные с производительностью приложения ...

mmalc 13.08.2009 18:32

Тот факт, что на современных устройствах памяти больше, не может служить оправданием для траты памяти. Конечно, здесь потрачены лишние 32 бита или есть небольшое изменение, но если это поле структуры или переменная экземпляра, и она выделяется тысячи раз, это становится эффектом никель-и-копейки. Небрежное программирование и неосознанное использование 64-битных значений вместо 32-битных приводит к раздуванию памяти - если у вас есть возможность этого избежать, я не могу придумать хорошего предлога, чтобы не схватить низко висящий плод.

Quinn Taylor 20.11.2009 22:04

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

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

Другие вопросы по теме