199

「ニュータイプ」BOOLYESNO)を見ました。

この型はほぼ char に似ていると読みました。

テストのために私がした:

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

両方のログに「1」が表示されるのは良いことです (C++ では bool が int で sizeof が 4 の場合があります)。

だから、bool型か何かに問題があるのではないかと思っていましたか?

速度を落とさずに bool (動作しているようです) を使用できますか?

4

10 に答える 10

206

の定義から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 は char であると想定できます。(C99)bool型を使用できますが、Apple のすべての Objective-C フレームワークとほとんどの Objective-C/Cocoa コードは BOOL を使用するため、BOOL を使用するだけで typedef が変更された場合に頭を悩ませることはありません。

于 2009-02-13T00:43:21.050 に答える
35

前述のように、BOOL は signed char です。bool - C99 標準の型 (int)。

BOOL - はい/いいえ。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");

そして結果は

REAL b1
REAL b2
NOT REAL 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");

それで..今何が得られますか?:-)

于 2011-06-22T09:01:43.600 に答える
13

これを書いている時点で、これは 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では、他のすべてのデバイス (OS X、32 ビット iOS) とBOOLまったく同じであり、コンパイラ フラグによってオーバーライドすることさえできないことを意味します。boolsigned char-funsigned-char

また、このサンプル コードはプラットフォームによって異なる動作をすることも意味します (自分でテストしました)。

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

ところで、可能な値の約0.4%が負になるため、変数のようなものarray.countを割り当てることはありません。BOOL

于 2015-10-30T15:24:43.380 に答える
8

使用する必要がある Objective-C の型は ですBOOL。ネイティブのブール データ型のようなものはありません。したがって、すべてのコンパイラでコードがコンパイルされることを確認するには、BOOL. (これは Apple-Frameworks で定義されています。

于 2009-02-12T14:08:32.997 に答える
5

うん、objc.hによると、BOOLはsigned charのtypedefです。

しかし、私はブールについて知りません。それはC++のことですよね?1 が YES/true、0 が NO/false である signed char として定義されている場合、どちらを使用してもかまわないと思います。

ただし、BOOL は Objective-C の一部であるため、わかりやすくするために BOOL を使用する方が理にかなっている可能性があります (他の Objective-C 開発者は、bool が使用されているのを見て困惑する可能性があります)。

于 2009-02-12T14:02:00.140 に答える
4

bool と BOOL のもう 1 つの違いは、キー値を監視する場合、または -[NSObject valueForKey:] のようなメソッドを使用する場合に、正確に同じ種類のオブジェクトに変換されないことです。

誰もがここで言ったように、BOOL は char です。そのため、char を保持する NSNumber に変換されます。このオブジェクトは、「A」や「\0」などの通常の文字から作成された NSNumber と区別がつきません。元々 BOOL だったという情報が完全に失われました。

ただし、bool は CFBoolean に変換されます。これは NSNumber と同じように動作しますが、オブジェクトのブール値のオリジンを保持します。

これは BOOL 対 bool の議論の議論ではないと思いますが、これはいつかあなたを噛むかもしれません。

一般的に言えば、BOOL を使用する必要があります。これは、Cocoa/iOS API (C99 およびそのネイティブの bool 型よりも前に設計された) のあらゆる場所で使用される型であるためです。

于 2012-05-08T08:12:46.723 に答える
2

受け入れられた回答が編集され、その説明が少し不正確になりました。コード サンプルは更新されましたが、以下のテキストは同じままです。アーキテクチャとプラットフォームに依存するため、現時点では BOOL が char であると想定することはできません。したがって、32 ビット プラットフォーム (iPhone 5 など) でコードを実行し、@encode(BOOL) を出力すると、"c" が表示されます。char型に対応しています。しかし、iPhone 5s (64 ビット) でコードを実行すると、「B」が表示されます。bool型に対応しています。

于 2016-02-13T13:20:10.657 に答える
1

私はここで慣習に反対します。typedefを基本型にするのは好きではありません。価値を取り除くのは役に立たない間接参照だと思います。

  1. ソースに基本タイプが含まれていると、すぐにわかります。typedefの場合は、実際に何を扱っているかを確認するために検索する必要があります。
  2. 別のコンパイラに移植したり、別のライブラリを追加したりすると、それらのtypedefのセットが競合し、デバッグが困難な問題が発生する可能性があります。私は実際にこれに対処し終えたところです。あるライブラリでは、ブール値はintにtypedefされ、mingw/gccではcharにtypedefされました。
于 2010-04-05T17:15:51.347 に答える