web-dev-qa-db-ja.com

BOOLのデフォルト値

Objective-CのBOOL変数のデフォルト値は何ですか?

91
suse

noデフォルト値があります

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

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

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

(注:ARCが有効な場合、ローカルオブジェクトポインターは常にデフォルト値nilを持ちますが、ローカル変数は非オブジェクトBOOLのような型は依然としてガーベッジに初期化されます。 nilに設定されたローカル変数(Objective-C) を参照してください。

172
kennytm

Xcode 5.1、OS X Mavericks 10.9.4を使用して、独自の実験を行いました。 ALogがわからない場合は、NSLogを修正します。とにかく、最初の実験では、isLandscapeをパブリック変数として使用し、@synthesizeを使用して、親View Controller(下に表示)からアクセスしました。 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

第三の実験では、「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によって自動的に初期化されると思いますが、ローカル変数はまったく値を取得しません。それでも、[Line 164]ローカル変数はYESまたはNOではありませんが、非nilですか?頼りにならないのは(ランダムな)ゴミ値だと思います。これが次の人に役立つことを願っています。私は何かを学びましたが、コメントを楽しみにしています。ありがとう、そして幸運を!

24
Murat Zazi