BOOLのデフォルト値


回答:


175

あなたが書いた場合デフォルト値はありません

-(void)somemethod {
  BOOL x;  // <--- no default value

ガベージに初期化されます。

ただし、BOOL ivarの場合、初期化時にNOインスタンス全体が0で満たされるため、に初期化されます。

(注:ARCが有効になっている場合、ローカルオブジェクトポインターは常にデフォルト値になりますが、nilBOOLなどの非オブジェクトタイプのローカル変数は引き続きガベージに初期化されます。ローカル変数がnil?に設定されている(Objective-C)を参照してください。)


1
非ivar BOOLが常に同じゴミであると期待できますか?それとも違いますか?(つまり、NSlogステートメントで「2」の整数値に評価されると思います)
bentford

8
@bentford:いいえ、できません。
kennytm

@bentford ivarはNO上記のように初期化されます。私はあなたがvarを意味すると思います。
Raffi Khatchadourian、2011

1
ささいなことのようですが、知っておくことが非常に重要です!ありがとう!!

1
@KennyTM「ARCが有効になっているBOOLなどの非オブジェクトタイプは、ガベージに初期化されます」。よろしいですか?あなたが提供するリンクは、「オブジェクトを割り当てるとき、Objective-Cオブジェクトのインスタンス変数は常に0(またはnil)に設定されている」と述べており、他の明確な参照を見つけることができないので、それはすべて少し矛盾しています。
Kristof Van Landschoot 2013

24

Xcode 5.1、OS X Mavericks 10.9.4を使用して、自分でいくつかの実験を行いました。ALogを知らない人のために、変更されたNSLogです。とにかく、最初の実験はisLandscape、パブリック変数として使用することでした。@synthesize、親のビューコントローラー(以下に表示)からアクセスされるすることでした。2番目の実験は使用せず@synthesize、明らかにself.isLandscapeコンソールで同じ結果を得るために使用しました。コンソール出力は私のコードの下にあります。3番目の実験では、メソッド内のローカル変数として「isLandscape」を使用しました。

@interface MyClass : UIView // (subclass used in my UIViewController)

@property (nonatomic) BOOL isLandscape;  // < - - - testing this BOOL


@implementation MyClass

@synthesize isLandscape;

- (void)awakeFromNib
{
    [super awakeFromNib];
    // Test for YES or NO
    if (isLandscape == YES) {
        ALog(@"isLandscape == YES");
    } else if (isLandscape == NO) {
        ALog(@"isLandscape == NO");
    } else {
        ALog(@"isLandscape != YES/NO");
    }
    // Test for nil or non-nil
    if (isLandscape) {
        ALog(@"isLandscape");
    } else if (!isLandscape) {
        ALog(@"!isLandscape");
    } else {
        ALog(@"!= nil/non-nil");
    }
    // Test its value
    ALog(@"isLandscape == %d", isLandscape);
}

これらの結果は最初の2つの実験からのものです…

2014-08-28 08:18:52.909 MyApp[493:60b] -[MyClass awakeFromNib] [Line 157] isLandscape == NO
2014-08-28 08:18:52.911 MyApp[493:60b] -[MyClass awakeFromNib] [Line 166] !isLandscape
2014-08-28 08:18:52.912 MyApp[493:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == 0

3番目の実験では、「isLandscape」はプロパティではなくなりました。私は興味深い結果を持つローカル変数に設定しました:

- (void)awakeFromNib
{
    [super awakeFromNib];
    BOOL isLandscape; // < - - - testing this BOOL
    // Test for YES or NO
    if (isLandscape == YES) {
        ALog(@"isLandscape == YES");
    } else if (isLandscape == NO) {
        ALog(@"isLandscape == NO");
    } else {
        ALog(@"isLandscape != YES/NO");
    }
    // Test for nil or non-nil
    if (isLandscape) {
        ALog(@"isLandscape");
    } else if (!isLandscape) {
        ALog(@"!isLandscape");
    } else {
        ALog(@"!= nil/non-nil");
    }
    // Test its value
    ALog(@"isLandscape == %d", isLandscape);
}

これらの結果は3番目の実験からのものです…

2014-08-28 08:28:33.483 MyApp[581:60b] -[MyClass awakeFromNib] [Line 159] isLandscape != YES/NO
2014-08-28 08:28:33.486 MyApp[581:60b] -[MyClass awakeFromNib] [Line 164] isLandscape
2014-08-28 08:28:33.487 MyApp[581:60b] -[MyClass awakeFromNib] [Line 172] isLandscape == -24

プロパティは私またはXcodeによって自動的に初期化されると思いますが、ローカル変数はまったく値を取得しません。それでも、[行164]を見てください。ローカル変数はYESまたはNOではありませんが、nil以外ですか?数えられない(ランダムな)ゴミの値だと思います。これが次の人のお役に立てば幸いです。何かを学びましたが、コメントをお待ちしています。よろしくお願いします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.