nsnumber와 nsinteger의 차이점은 무엇입니까?
-
18-09-2019 - |
문제
nsnumber와 nsinteger의 차이점은 무엇입니까? 내가 알아야 할 이와 같은 프리미티브가 더 있습니까? 플로트를위한 것이 있습니까?
해결책
기존 답변은 유용합니다. 그들에게 추가 :
예, NSUInteger
양의 정수 사이에서 두 배의 범위를 제공합니다 NSInteger
,하지만 두 사람 중에서 선택해야 할 또 다른 중요한 이유는 단순히 사례를 구별하는 것입니다. 부정적인 값이 단순히 의미가없는 곳.
예시: 반환 값 NSArray
'에스 count
메소드는 an입니다 NSUInteger
, 우리는 음수의 요소가있는 배열을 가질 수 없기 때문에 의미가 있습니다. 코더가 서명되지 않았다는 것을 알면 서명과 같은 비트 타이어 작업을 포함하여 서명 된 케이스에서 신뢰할 수없는 작업을 수행 할 수있는 자유가 더 많습니다. 이 블로그 게시물 서명 대에 대해 더 많은 이야기를합니다.
내 추측 CGFloat
vs NSFloat
(존재하지 않음) : NextStep-Named 코드 요소의 설계자가 시간 간격 외에 너무 많은 플로트 값을 지정할 필요가 없었던 경우입니다. 그래서 그들은 주었다 NSTimeInterval
, 부동 소수점 유형이지만 시간 간격으로 사용하기위한 것입니다. 그리고 솔직히 말해서, 구조물을 다루지 않고 항상 몇 초 안에 있다는 것을 알고 있기 때문에 그 유형을 갖는 것이 좋습니다. 그래픽 세계 (핵심 그래픽이 살고있는 곳)로 이동하면 갑자기 떠 다니면서 공중 (haha)에 떠 다니고 있습니다. 따라서 소개하는 것이 합리적입니다 CGFloat
거기. 이 단락은 모두 "교육 된 추측"입니다.
또한 명확하게하기 위해 당신이 사용할 수있는 이유 NSInteger
기본 유형 대신 등: 이런 식으로 기계 아키텍처를 최대한 활용하는 휴대용 코드를 작성하는 것이 더 쉽습니다. 예를 들어, a CGFloat
일부 기계에는 32 개의 비트와 다른 기계에는 64 비트를 사용합니다. 그 크기의 해당 기계에 효율성 간격이 얼마나 많은지에 따라 크게 사용됩니다. 경우에 따라 32 비트 대 64 비트를 사용할 수있는 실제 속도가 없으므로 64 비트를 사용할 수도 있습니다. 당신이 물건을 선언했다면 CGFloat
다시 컴파일 할 때 갑자기 "무료로"추가 정밀도를 얻습니다.
그리고 Ikenndac이 지적했듯이 NSNumber
모두를위한 래퍼 클래스입니다 이 중 BOOL
)이를 통해 귀하가 포함시킬 수 있습니다 NSArray
모래 NSDictionary
s, 더 쉽게 보관하고 다른 일을하십시오. NSObject
할 수 있습니다.
다른 팁
NSNumber
원시가 아닌 클래스이며, 사전 숫자, 배열 또는 다른 방식으로 캡슐화해야 할 때 사용됩니다. NSInteger
, NSUInteger
, CGFloat
, 등은 간단한 유형이며 (iPhone과 같은 32bt 시스템에서) int
, unsigned int
그리고 float
.
일반적으로 숫자를 어딘가에 보관 해야하는 경우 사용하십시오. NSNumber
. 계산, 루프 등을 사용하는 경우 사용 NSInteger
, NSUInteger
또는 CGFloat
.
당신은 랩을 할 수 있습니다 NSInteger
에 NSNumber
:
NSNumber *aNumber = [NSNumber numberWithInteger:21];
... 그리고 그것을 되 찾으십시오 :
NSInteger anInteger = [aNumber integerValue];
자세한 내용은 다음을 확인할 수 있습니다. http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html
Nsinteger는 전통적인 것과 같습니다 int
C.에서 그것은 typedef입니다. 다른 사람들이 있습니다 NSUInteger
, CGFloat
, 모든 것이 원시 유형의 동의어입니다.
nsnumber는 nsarray 또는 nsdictionary에 숫자를 붙일 때 유용합니다. 표준 관행은 이러한 컬렉션을 사용하는 것과 직접 굴리는 것입니다. 단점은 목표 C 객체 만 포함 할 수 있다는 것입니다.
NSNUMBER는 본질적으로 랩을 마무리합니다 int
배열에 추가 할 수있는 OBJ-C 객체 (C#/Java의 'Boxing'원시 유형의 개념과 유사)로 (플로트 등) : 배열에 추가 할 수 있습니다.
NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok
성능의 이유로 가능하면 원시 유형 (int, float, int [])을 사용하십시오. 그러나 때때로, 당신은 당신이 입장을 읽거나 쓰는 것과 같은 nsarray/nsnumber를 피할 수 없습니다. .plist
파일.
NSNUMBER는 일반적으로 변수 저장에 사용되며 NSUINTEGER는 산술에 사용됩니다.
이 작업을 수행하여 nsnumber를 nsuinteger로 변경할 수 있습니다.
NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];
이전에 말되었지만 일반적으로 판단의 규칙으로서 *로 정의 해야하는 변수는 객관적인 C 클래스 인 반면 A *가 필요하지 않은 변수는 C 프리미티브입니다.
이전에 다른 사람들이 말했듯이 NSNumber
이다 NSObject
아강. 그것은 C 프리미티브가 아닙니다 (int, 부호없는 int, float, double 등과 마찬가지로) NSInteger
, CGFloat
, NSUInteger
간단합니다 typedefs
C 프리미티브를 통해.
에 대한 필요성 NSNumber
숫자를 객체를 요구하는 API에 매개 변수로 숫자를 사용해야 할 필요성에서 발생합니다. 예를 들어, 숫자를 NSArray
, 코어-데이터 또는 an NSDictionary
.
내가 알아야 할 이와 같은 프리미티브가 더 있습니까? 잘, NSNumber
원시 유형이 아니며 모든 종류의 숫자 (플로트, 적분 유형, 부울 등)를 감싸고 있습니다. 또한 NSValue에 대해 배워야합니다. NSNumber
.
플로트를위한 것이 있습니까? Float 용 "NS"TypEdef는 없지만 NSNumber
플로트 번호를 감싸 수 있습니다.
NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];
또는 CoreGraphics 원시 유형 CGFloat를 사용할 수 있습니다.