Cocoa에서는 NSInteger 또는 int를 선호합니까? 그 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/13725

  •  08-06-2019
  •  | 
  •  

문제

NSInteger/NSUInteger 일반 내장 유형에 대한 코코아 정의 대체물입니다.

내장형보다 NS* 유형을 사용하면 어떤 이점이 있습니까?어느 쪽을 선호하며 그 이유는 무엇입니까?~이다 NSInteger 그리고 int 32비트/64비트 플랫폼에서 너비가 동일합니까?

도움이 되었습니까?

해결책

내가 이해하는 방식은 NSInteger et al.해당 C 유형의 아키텍처 안전 버전입니다.기본적으로 그 크기는 아키텍처에 따라 다르지만, 예를 들어 NSInteger는 현재 아키텍처에 대한 유효한 포인터를 보유하는 것이 보장됩니다.

Apple에서는 OS X 10.5 이상에서 작업할 때 이러한 기능을 사용할 것을 권장하며 Apple의 API도 이를 사용하므로 사용하는 습관을 들이는 것이 좋습니다.좀 더 타이핑이 필요하지만 그 외에는 사용하지 않을 이유가 없는 것 같습니다.

다른 팁

64비트 런타임의 양자화 문제

어떤 상황에서는 대신에 표준 유형을 사용하는 것이 타당한 이유가 있을 수 있습니다. NSInteger:64비트 시스템에서 "예기치 않은" 메모리 팽창.

정수가 4바이트가 아닌 8인 경우 값이 차지하는 메모리 양은 두 배가 됩니다.그러나 모든 값이 정수는 아니라는 점을 고려하면 일반적으로 애플리케이션의 메모리 공간이 두 배로 늘어날 것으로 예상해서는 안 됩니다.그러나 Mac OS X에서 메모리를 할당하는 방식은 요청된 메모리 양에 따라 달라집니다.

현재는 512바이트 이하를 요구할 경우, malloc 16바이트의 다음 배수로 반올림됩니다.그러나 512바이트 이상을 요청하면 malloc 512의 다음 배수(최소 1024바이트)로 반올림됩니다.그렇다면 무엇보다도 다섯 가지를 선언하는 클래스를 정의한다고 가정해 보겠습니다. NSInteger 인스턴스 변수이며 32비트 시스템에서는 각 인스턴스가 272바이트를 차지합니다.64비트 시스템에서 인스턴스에는 이론적으로 544바이트가 필요합니다.그러나 메모리 할당 전략으로 인해 각각은 실제로 1024바이트(거의 4배 증가)를 차지합니다.이러한 개체를 많이 사용하는 경우 응용 프로그램의 메모리 공간은 예상보다 상당히 커질 수 있습니다.교체했다면 NSInteger 변수 sint_32 변수에서는 512바이트만 사용합니다.

따라서 사용할 스칼라를 선택할 때는 합리적인 것을 선택해야 합니다.32비트 애플리케이션에 필요한 것보다 더 큰 값이 필요한 이유가 있습니까?초 수를 계산하기 위해 64비트 정수를 사용하는 것은 필요하지 않습니다...

실제로 64비트는 NSInteger 및 NSUInteger의 존재 이유입니다.10.5 이전에는 존재하지 않았습니다.두 개는 단순히 64비트에서는 long으로, 32비트에서는 int로 정의됩니다.

#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에는 추가 정보가 있습니다.

나는 표준 C 스타일 선언을 선호하지만 여러 언어 사이를 전환하기 때문에 그것에 대해 너무 많이 생각할 필요는 없지만 nsinteger를 살펴봐야 할 것 같습니다.

파일이나 인터넷을 통해 데이터를 가져오고 내보내는 데 사용합니다. UInt32, SInt64 등...

이는 아키텍처에 관계없이 특정 크기가 보장되며 해당 유형을 공유하는 다른 플랫폼 및 언어로 코드를 포팅하는 데 도움이 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top