Ich habe den "neuen Typ" BOOL
( YES
, NO
) gesehen.
Ich habe gelesen, dass dieser Typ fast wie ein Saibling 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 Größe ist 4)
Also habe ich mich nur gefragt, ob es Probleme mit dem Bool-Typ gibt oder so?
Kann ich einfach bool verwenden (das scheint zu funktionieren), ohne an Geschwindigkeit zu verlieren?
quelle
bool
. Alle Objective-C-Frameworks verwendenBOOL
.NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)
// es gibt immer gibtNO
Aber sobald ich diesen(progressTime>=totalTime)
Wert inbool
Typ erhaltensuccess
habe, gibt es das richtige Ergebnis zurück. Ich verstehe dieses Verhalten nicht. Ich benutzeXcode 7.x
und dieiOS
Version war8.x
. @ BarryWarkWie oben erwähnt, ist BOOL ein signiertes Zeichen. Bool - Typ aus C99 Standard (int).
BOOL - JA / NEIN. bool - wahr / falsch.
Siehe Beispiele:
Und das Ergebnis ist
Beachten Sie, dass bool! = BOOL. Ergebnis unten ist nur EINMAL WIEDER - REAL b2
Wenn Sie bool in BOOL konvertieren möchten, sollten Sie den nächsten Code verwenden
Also in unserem Fall:
Und so ... was bekommen wir jetzt? :-)
quelle
!!b1
. Um zwischen ihnen zu konvertierenZum Zeitpunkt des Schreibens ist dies die neueste Version von objc.h:
Dies bedeutet, dass auf 64-Bit-iOS-Geräten und unter WatchOS
BOOL
genau dasselbe ist wiebool
auf allen anderen Geräten (OS X, 32-Bit-iOS)signed char
und nicht einmal durch das Compiler-Flag überschrieben werden kann-funsigned-char
Dies bedeutet auch, dass dieser Beispielcode auf verschiedenen Plattformen unterschiedlich ausgeführt wird (selbst getestet):
BTW nie assign Dinge wie
array.count
zuBOOL
variabel , da etwa 0,4% der möglichen Werte negativ sein wird.quelle
Der Objective-C-Typ, den Sie verwenden sollten, ist
BOOL
. Es gibt nichts Schöneres als einen nativen booleschen Datentyp. Stellen Sie daher sicher, dass der Code auf allen Compilern kompiliert wirdBOOL
. (Es ist in den Apple-Frameworks definiert.quelle
BOOL
wird durch die Objective-C-Sprache (in einem derobjc/*.h
Header) definiert, nicht durch die Frameworks. Außerdem gibt es beim Kompilieren mit C99 (was meiner Meinung nach die Standardeinstellung ist) einen nativen Booleschen Typ_Bool
(oderbool
fallsstdbool.h
enthalten).Ja, BOOL ist ein typedef für ein signiertes Zeichen gemäß objc.h.
Ich weiß allerdings nichts über Bool. Das ist eine C ++ - Sache, oder? Wenn es als vorzeichenbehaftetes 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 aus Gründen der Übersichtlichkeit wahrscheinlich sinnvoller, ein BOOL zu verwenden (andere Objective-C-Entwickler sind möglicherweise verwirrt, wenn sie sehen, dass ein Bool verwendet wird).
quelle
Ein weiterer Unterschied zwischen bool und BOOL besteht darin, dass sie nicht genau in dieselbe Art von Objekten konvertiert werden, wenn Sie Schlüsselwerte beobachten oder Methoden wie - [NSObject valueForKey:] verwenden.
Wie jeder hier gesagt hat, ist BOOL char. Als solches wird es in eine NSNumber konvertiert, die ein Zeichen enthält. Dieses Objekt ist nicht von einer NS-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, völlig verloren.
Bool wird jedoch in einen CFBoolean konvertiert, der sich wie NSNumber verhält, jedoch den booleschen Ursprung des Objekts beibehält.
Ich denke nicht, dass dies ein Argument in einer Debatte zwischen BOOL und Bool ist, aber dies 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 (entwickelt vor C99 und seinem nativen Bool-Typ).
quelle
Die akzeptierte Antwort wurde bearbeitet und ihre Erklärung ist etwas falsch. Das Codebeispiel wurde aktualisiert, der folgende Text bleibt jedoch unverändert. Sie können vorerst nicht davon ausgehen, dass BOOL ein Zeichen ist, da es von der Architektur und der Plattform abhängt. Wenn Sie also Ihren Code auf einer 32-Bit-Plattform (z. B. iPhone 5) ausführen und @encode (BOOL) drucken, wird "c" angezeigt. Es entspricht einem Zeichentyp . Wenn Sie Ihren Code jedoch auf dem iPhone 5s (64 Bit) ausführen, wird "B" angezeigt. Es entspricht einem Bool-Typ .
quelle
Ich verstoße hier gegen die Konvention. Ich mag keine Typedefs zu Basistypen. Ich denke, es ist eine nutzlose Indirektion, die Wert entfernt.
quelle
size_t
), und sowohlbool
(C99) als auchBOOL
(ObjC) fallen in diese Kategorie. Und wenn Ihr Code aufgrund einer Änderung von typedef fehlgeschlagen ist, ist Ihr Code schuld, da Sie den typedef anscheinend nicht als undurchsichtig behandelt haben, sondern sich auf seine Implementierung auf einer Plattform verlassen haben. (Nichts, wofür man sich schämen muss, es passiert, aber es ist nicht der Typedef, der die Schuld trägt.)BOOL varname
stattdessen Ihren Booleschenchar varname
Wert deklarieren, es offensichtlicher ist, dass die beiden gültigen Werte für diese Variabletrue
/YES
oderfalse
/ sindNO
.Wie oben erwähnt,
BOOL
kann dies einunsigned char
Typ sein, der von Ihrer Architektur abhängt, während erbool
vom Typ istint
. Ein einfaches Experiment zeigt den Unterschied, warum sich BOOL und Bool unterschiedlich verhalten können:Zu Ihrer Überraschung
if(objcBOOL != YES)
wird vom Compiler 1 bewertet, daYES
es sich tatsächlich um den Zeichencode 1 handelt, und in den Augen des Compilers ist der Zeichencode 64 natürlich nicht gleich dem Zeichencode 1, daher wird die if-Anweisung alsYES/true/1
und die folgende Zeile ausgewertet Lauf. Da einbool
Typ ungleich Null immer den ganzzahligen Wert 1 ergibt, wirkt sich das oben genannte Problem nicht auf Ihren Code aus. Im Folgenden finden Sie einige gute Tipps, wenn Sie denObjective-C BOOL
Typ im Vergleich zumANSI C bool
Typ verwenden möchten :YES
oderNO
und sonst nichts zu.BOOL
Typen mit dem!!
Operator double not , um unerwartete Ergebnisse zu vermeiden.YES
Verwendung istif(!myBool) instead of if(myBool != YES)
es viel sauberer, den!
Operator not zu verwenden , und es wird das erwartete Ergebnis erzielt.quelle
Beachten Sie auch die Unterschiede beim Casting, insbesondere bei der Arbeit mit Bitmasken, aufgrund des Castings auf signiertes Zeichen:
Wenn BOOL ein vorzeichenbehaftetes Zeichen anstelle eines Bools ist, wird bei der Umwandlung von 0x0100 in BOOL einfach das gesetzte Bit gelöscht, und der resultierende Wert ist 0.
quelle