[ios] NSInteger, NSUInteger on 32bit / 64bit
-
32bit 에서..
NSInteger, NSUInteger 는 각각 int, unsigned int 에 mapping 된다.
그래서 로그를 찍을 때 formmatting char 에는 %d 와 %u 에 각각 매핑된다.
-
64bit 에서는...
NSInteger, NSUInteger 는 각각 long 과 unsinged long 에 mapping 된다.
그래서 로그를 찍을 때 formmatting char 에는 %ld 와 %lu 에 각각 매핑된다.
-
bit 에 상관없이 formmatting char 를 가장 안전하게 사용하는 방법은
NSInteger, NSUInteger 를 NSNumber 로 converting 해서 %@ 형태로 프린팅하는 것이다.
converting 은 @(number) 와 같은 방법으로 손쉽게 할 수 있다.
( 이 방법은 tagged pointer 라는 것때문에 새로운 object 를 만드는 것도 아니라고 한다, tagged pointer 는 알아서 찾아보셈. )
-
그래도 converting 하는 방법이 별로라면..
NSInteger 는 long 으로 NSUInteger 는 unsigned long 으로 converting 해서 printing 하는 것이 안전하다.
-
NSInteger 에는 %zd 를, NSUInteger 에는 %tu 를 사용하는 것이 좋다는 이야기도 있다.
그러나 이는 세부 내용을 보면 z 와 t 의 내부구현이 변경소지가 있기 때문에 이 역시 위험할 수 있다고….
-
아래와 같이 define 하여 사용하는 것이 가장 안전하다는 이야기도 있다.
#if __LP64__
#define NSI "ld"
#define NSU "lu"
#else
#define NSI "d"
#define NSU "u"
#endif
ex)
[NSString stringWithFormat:@"%"NSU" things in the array.", array.count]
-
개인적으로 여러 가지 방법을 보았을 때 가장 합리적이며 안정적인 방법은 NSNumber 로 wrapping 해서 %@ 를 사용하는 방법이다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[iOS] 앱이 지원하는 File Type 등록하고 처리하기 (0) | 2018.02.20 |
---|---|
[ios] 32bit, 64bit 이야기 (0) | 2018.02.18 |
[ios] beginBackgroundTaskWithExpirationHandler: 에 대한 연구 (0) | 2018.02.16 |
SIGABRT vs SIGSEGV (0) | 2018.02.14 |
[ios] Memory Management Debugging. (0) | 2018.02.13 |
댓글