Objective-C : BOOL vs. bool

Lesezeit: 6 Minuten

Benutzeravatar von Francescu
Francescu

Ich habe den “neuen Typ” gesehen BOOL (YES, NO).

Ich habe gelesen, dass dieser Typ fast wie ein Char ist.

Zum Testen habe ich gemacht:

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

Gut zu sehen, dass beide Protokolle “1” anzeigen (manchmal ist in C++ bool ein int und seine sizeof ist 4)

Also habe ich mich nur gefragt, ob es Probleme mit dem bool-Typ oder so gibt?

Kann ich einfach bool verwenden (das scheint zu funktionieren), ohne an Geschwindigkeit zu verlieren?

Benutzeravatar von Barry Wark
Barry Wark

Aus der Definition in 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)

Sie können also davon ausgehen, dass BOOL ein Zeichen ist. Sie können die (C99) bool type, aber alle Objective-C-Frameworks von Apple und der meiste Objective-C/Cocoa-Code verwenden BOOL, sodass Sie sich Kopfschmerzen ersparen, wenn sich die Typedef jemals ändert, indem Sie einfach BOOL verwenden.

  • “alle Frameworks von Apple” – nicht wahr. Sehen Sie sich CGGeometry.h an, insbesondere: CG_INLINE bool __CGPointEqualToPoint(CGPoint point1, CGPoint point2) { return point1.x == point2.x && point1.y == point2.y; }

    – Elliot

    19. November 2009 um 8:32 Uhr

  • @ Elliot Du hast Recht. Viele der C-Frameworks (CoreFoundation, CoreGraphics usw.) verwenden C99 bool. Alle von Objective-C verwendeten Frameworks BOOL.

    – Barry Wark

    5. April 2010 um 16:48 Uhr

  • @Cœur Sie haben die Definition des BOOL-Codebeispiels bearbeitet, aber der Text unten bleibt gleich. Das ist etwas verwirrend und falsch. Siehe meine Antwort.

    – neugierig

    13. Februar 2016 um 13:20 Uhr

  • Lernen Sie das unterschiedliche Verhalten kennen, werfen Sie einen Blick auf unten. NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)// es gibt immer NO Aber sobald ich das erhalten habe (progressTime>=totalTime) Wert hinein bool Typ success es gibt das richtige Ergebnis zurück. Ich verstehe dieses Verhalten nicht. ich benutze Xcode 7.x und die iOS Fassung war 8.x. @BarryWark

    – Kamar Shad

    16. Februar 2016 um 4:41 Uhr


Wie oben erwähnt, ist BOOL ein Zeichen mit Vorzeichen. bool – Typ vom C99-Standard (int).

BOOL – JA/NEIN. bool – wahr/falsch.

Siehe Beispiele:

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");

Und Ergebnis ist

REAL b1
WIRKLICH b2
NICHT WIRKLICH b2

Beachten Sie, dass bool != BOOL. Ergebnis unten ist nur NOCH EINMAL – REAL b2

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

Wenn Sie bool in BOOL konvertieren möchten, sollten Sie den nächsten Code verwenden

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

Also in unserem Fall:

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");

Und so.. was bekommen wir jetzt? 🙂

  • Sie könnten statt der Verwendung des ternären Operators verwenden !!b1. Um zwischen ihnen umzuwandeln

    – Richard J.Ross III

    16. März 2012 um 18:34 Uhr


  • „NOT REAL b2“ steht nicht auf meinem iPhone SE-Simulator.

    – Schwätzer

    5. Januar 2017 um 10:40 Uhr

Zum Zeitpunkt des Schreibens ist dies die neueste Version von 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

Dies bedeutet, dass auf 64-Bit-iOS-Geräten und auf WatchOS BOOL ist genau dasselbe wie bool während es auf allen anderen Geräten (OS X, 32-Bit-iOS) ist signed char und kann nicht einmal vom Compiler-Flag überschrieben werden -funsigned-char

Dies bedeutet auch, dass dieser Beispielcode auf verschiedenen Plattformen unterschiedlich ausgeführt wird (selbst getestet):

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

BTW weise niemals Dinge zu wie array.count zu BOOL variabel, da etwa 0,4 % der möglichen Werte negativ sein werden.

  • Der Compiler löst einen Fehler aus, wenn Sie bool als Parameter eines Blocks verwenden, der so definiert ist, dass er einen BOOL erhält (z. B. UIView-Animationsblöcke), wenn Sie für iOS 32 Bit (iPhone 5C …) kompilieren. Ich verwende C++ bool überall in meinem Code und BOOL in den APIs, die mit BOOL definiert sind

    – Stephan K.

    6. März 2020 um 11:16 Uhr

Der Objective-C-Typ, den Sie verwenden sollten, ist BOOL. Es gibt nichts Besseres als einen nativen booleschen Datentyp, daher ist darauf zu achten, dass der Code auf allen Compilern kompiliert wird BOOL. (Es ist in den Apple-Frameworks definiert.

Yup, BOOL ist ein Typedef für ein signiertes Zeichen gemäß objc.h.

bool weiß ich aber nicht. Das ist eine C++-Sache, richtig? Wenn es als signiertes Zeichen definiert ist, wobei 1 JA/wahr und 0 NEIN/falsch ist, dann ist es meiner Meinung nach egal, welches Sie verwenden.

Da BOOL jedoch Teil von Objective-C ist, ist es wahrscheinlich sinnvoller, aus Gründen der Übersichtlichkeit ein BOOL zu verwenden (andere Objective-C-Entwickler könnten verwirrt sein, wenn sie sehen, dass ein Bool verwendet wird).

  • _Bool ist in C99 definiert, und im Standardheader stdbool.h ist das Makro bool definiert (das zu _Bool erweitert wird) und true/false sind hier ebenfalls definiert.

    – Brian Mitchell

    27. März 2009 um 20:08 Uhr

Benutzeravatar von Gwendal Roué
Gwendal Roué

Ein weiterer Unterschied zwischen bool und BOOL besteht darin, dass sie nicht genau in die gleiche Art von Objekten konvertiert werden, wenn Sie Schlüsselwerte beobachten oder Methoden wie -[NSObject valueForKey:].

Wie alle hier gesagt haben, ist BOOL char. Als solches wird es in eine NSN-Nummer umgewandelt, die ein Zeichen enthält. Dieses Objekt ist nicht von einer NSN-Nummer zu unterscheiden, die aus einem regulären Zeichen wie ‘A’ oder ‘\0’ erstellt wurde. Sie haben die Information, dass Sie ursprünglich einen BOOL hatten, vollständig verloren.

bool wird jedoch in einen CFBoolean konvertiert, der sich genauso verhält wie NSNumber, aber den booleschen Ursprung des Objekts beibehält.

Ich glaube nicht, dass dies ein Argument in einer BOOL vs. Bool-Debatte ist, aber das könnte Sie eines Tages beißen.

Im Allgemeinen sollten Sie sich für BOOL entscheiden, da dies der Typ ist, der überall in den Cocoa/iOS-APIs verwendet wird (entworfen vor C99 und seinem nativen bool-Typ).

  • _Bool ist in C99 definiert, und im Standardheader stdbool.h ist das Makro bool definiert (das zu _Bool erweitert wird) und true/false sind hier ebenfalls definiert.

    – Brian Mitchell

    27. März 2009 um 20:08 Uhr

Benutzeravatar von neugierig
neugierig

Die akzeptierte Antwort wurde bearbeitet und ihre Erklärung wurde etwas falsch. Das Codebeispiel wurde aktualisiert, aber der Text unten bleibt gleich. Sie können vorerst nicht davon ausgehen, dass BOOL ein Zeichen ist, da dies von Architektur und Plattform abhängt. Wenn Sie also Ihren Code auf einer 32-Bit-Plattform (z. B. iPhone 5) ausführen und @encode(BOOL) drucken, sehen Sie “c”. Es entspricht a Char-Typ. Aber wenn Sie Ihren Code auf dem iPhone 5s (64 Bit) ausführen, sehen Sie “B”. Es entspricht a bool-Typ.

1425690cookie-checkObjective-C : BOOL vs. bool

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy