2012-05-13 8 views
2

私はXcodeとiPhoneの開発に本当に新しいです。私はappDelegate.mファイルに関数getISlogged;と書いています。それはこのような何か行く:私はそれを実行したときに- (ブール)返信しない

SWGAppDelegate *appDelegate = (SWGAppDelegate *)[[UIApplication sharedApplication]delegate]; 
NSString *islog = @"no"; 
if(appDelegate.getISlogged){ 
    [email protected]"yes"; 
} 

今、私はいつもThread 1: breakpoint 2.1を取得し、私がやる何をすべきか見当がつかない:

- (BOOL) getISlogged { 
    NSUserDefaults *usenow = [NSUserDefaults standardUserDefaults]; 
    NSNumber *islog = nil; 
    if(usenow){ 
     islog = [usenow objectForKey:@"is_log"]; // should equal 1 or 0... 
    } 

    UIAlertView * alert1 = [[UIAlertView alloc] initWithTitle:@"works" message:@"test1" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil]; 
    [alert1 show]; 
    if (islog == [NSNumber numberWithInt:(1)]) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 

[OK]をので、は次のように、今、私は私のviewController.mからそれを呼び出しますそれ。私はすべてのコードを削除しようとしただけで、関数にreturn YES;を残して、私はまだ同じエラーを取得します。\

ありがとうございました。

+0

あなたは確か(またはアプリデリゲートでプロパティとして宣言します。)誤ってブレークポイントを追加したことはありませんか? :) –

答えて

9

単に例えば、むしろ、その整数値を抽出1との比較、及びそれに基づいてYES又はNOを返すより、NSNumberインスタンスのboolValueを返します鍵はユーザデフォルトに存在しない場合は、このメソッドの結果はNOなります

- (BOOL) getISlogged { 
    return [[[NSUserDefaults standardUserDefaults] objectForKey:@"is_log"] boolValue]; 
} 

:あなたの全体の方法はに減少させることができます。

別“コード-臭い”あなたは(@"yes"@"no"islogに割り当てられているとの)文字列にブール値を代入していることです。文字列をどこかに書き込むことを単純に計画している場合、それは何も問題ありません。この変数を使用してログに書き込むかどうかを決定する場合は、代わりにBOOLにする必要があります。文字列はテキストを格納するためのものです。

最後に、Objective-Cでは、==演算子がオブジェクトの同一性を比較する(つまり、2つの参照が同じオブジェクトを指していることを確認します)、オブジェクトの等価性を比較しません。 NSNumberまたは“の組み込みisEqual:メソッドを使用してボックス化された値”を抽出し、別のボックス化されていない値と比較することができます。これのどちらかは、トリックを行います:

if ([islog isEqualToNumber:[NSNumber numberWithInt:1]]) 
    // do something 

// or 

if ([islog intValue] == 1) 
    // do something 
5
if (islog == [NSNumber numberWithInt:(1)]) 

間違っています。 (値の代わりにアドレスを比較します)。

使用:代わりに

if ([islog intValue] == 1) 

+1

とにかく同じオブジェクトを指すことになります。多くの一般的な 'NSNumber'値がキャッシュされます。 – dreamlax

+0

@dreamlax:しかし、それはあなたが知っていると確信しているので、それは古典的な "実装の詳細なので、頼りにすべきではありません"です。 –

+0

@dreamlax重要なことはありませんチャンス –

0

がメソッドではなくプロパティとしてそれを呼び出す:

if([appDelegate getISlogged]){ 

関連する問題