[c] 오브젝티브 -C : BOOL vs Bool

“신형” BOOL( YES, NO)을 보았습니다 .

나는이 유형이 거의 문자와 같다는 것을 읽었습니다.

테스트를 위해 나는 :

NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));

두 로그 모두에 “1”이 표시되는 것을 확인하는 것이 좋습니다 (때로는 C ++ bool은 int이고 sizeof는 4 임).

그래서 부울 유형이나 무언가에 문제가 있는지 궁금합니다.

속도를 잃지 않고 부울을 사용할 수 있습니까?



답변

의 정의에서 objc.h:

#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
typedef bool BOOL;
#else
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

#define YES ((BOOL)1)
#define NO  ((BOOL)0)

따라서 BOOL이 문자라고 가정 할 수 있습니다. (C99) bool유형을 사용할 수 있지만 모든 Apple Objective-C 프레임 워크 및 대부분의 Objective-C / Cocoa 코드는 BOOL을 사용하므로 BOOL을 사용하여 typedef가 변경되면 두통을 피할 수 있습니다.


답변

위에서 언급했듯이 BOOL은 부호가있는 문자입니다. bool-C99 표준 (int)의 유형입니다.

BOOL-예 / 아니요. 부울-참 / 거짓.

예를보십시오 :

bool b1 = 2;
if (b1) printf("REAL b1 \n");
if (b1 != true) printf("NOT REAL b1 \n");

BOOL b2 = 2;
if (b2) printf("REAL b2 \n");
if (b2 != YES) printf("NOT REAL b2 \n");

결과는

실제 b1
실제 b2 실제 b2
아님

bool! = BOOL입니다. 아래 결과는 ONCE AGAIN-REAL b2 에만 해당됩니다.

b2 = b1;
if (b2) printf("ONCE AGAIN - REAL b2 \n");
if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");

bool을 BOOL로 변환하려면 다음 코드를 사용해야합니다

BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;

따라서 우리의 경우 :

BOOL b22 = b1 ? 2 : NO;
if (b22)    printf("ONCE AGAIN MORE - REAL b22 \n");
if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n");

그리고 우리는 지금 무엇을 얻습니까? 🙂


답변

글을 쓰는 시점에서 이것은 최신 버전의 objc.h입니다.

/// Type to represent a boolean value.
#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
#define OBJC_BOOL_IS_BOOL 1
typedef bool BOOL;
#else
#define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

즉, 64 비트 iOS 기기와 WatchOS BOOLbool다른 모든 기기 (OS X, 32 비트 iOS)와 동일하지만 signed char컴파일러 플래그로 재정의 할 수 없습니다.-funsigned-char

또한이 예제 코드는 다른 플랫폼에서 다르게 실행된다는 것을 의미합니다 (자체 테스트 한 결과).

int myValue = 256;
BOOL myBool = myValue;
if (myBool) {
    printf("i'm 64-bit iOS");
} else {
    printf("i'm 32-bit iOS");
}

BTW 는 가능한 값의 약 0.4 %가 음수가되기 때문에 변수 와 같은 array.count것을 할당하지 않습니다 BOOL.


답변

사용해야하는 Objective-C 유형은 BOOL입니다. 기본 부울 데이터 유형과 같은 것은 없으므로 모든 컴파일러에서 코드를 컴파일 할 때 사용하십시오 BOOL. (Apple-Frameworks에 정의되어 있습니다.


답변

예, BOOL은 objc.h에 따르면 서명 된 문자의 typedef입니다.

그래도 bool에 대해서는 모른다. 그것은 C ++ 일입니까? 1이 YES / true이고 0이 NO / false 인 부호있는 문자로 정의 된 경우 어떤 문자를 사용하든 상관 없습니다.

그러나 BOOL은 Objective-C의 일부이므로 명확성을 위해 BOOL을 사용하는 것이 더 합리적입니다.


답변

bool과 BOOL의 또 다른 차이점은 키-값 관찰을 수행하거나-[NSObject valueForKey :]와 같은 메소드를 사용할 때 동일한 종류의 객체로 정확하게 변환되지 않는다는 것입니다.

모두가 여기에서 말했듯이 BOOL은 char입니다. 따라서 char를 보유한 NSNumber로 변환됩니다. 이 개체는 ‘A’또는 ‘\ 0’과 같은 일반 문자로 만든 NSNumber와 구별 할 수 없습니다. 당신은 당신이 원래 BOOL을 가지고 있었던 정보를 완전히 잃어 버렸습니다.

그러나 bool은 CFNumber로 변환되어 NSNumber와 동일하게 동작하지만 오브젝트의 부울 원점은 유지합니다.

나는 이것이 BOOL vs. bool 토론에서 논쟁이라고 생각하지 않지만 이것은 언젠가 물릴 수 있습니다.

Cocoa / iOS API (C99 이전에 설계된 기본 bool 유형)에서 사용되는 유형이므로 일반적으로 BOOL을 사용해야합니다.


답변

수락 된 답변이 수정되었으며 설명이 약간 잘못되었습니다. 코드 샘플이 새로 고쳐졌지만 아래 텍스트는 동일하게 유지됩니다. BOOL은 아키텍처와 플랫폼에 따라 다르므로 현재로서는 문자라고 가정 할 수 없습니다. 따라서 32 비트 플랫폼 (예 : iPhone 5)에서 코드를 실행하고 @encode (BOOL)를 인쇄하면 “c”가 표시됩니다. char 타입에 해당 합니다 . 그러나 iPhone 5s (64 비트)에서 코드를 실행하면 “B”가 표시됩니다. 부울 유형에 해당 합니다 .