2

私は Xcode と iPhone の開発に本当に慣れていません。appDelegate.mというファイルに関数を書きましたgetISlogged;。次のようになります。

- (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;
    }
}

わかりました、今私は私のviewController.mようにそれを呼び出します:

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

今、私がそれを実行すると、私はいつも取得し、それをThread 1: breakpoint 2.1どうするかわかりません。すべてのコードを削除しreturn YES;て関数だけを残そうとしましたが、それでも同じエラーが発生します =\

ヘルプやヒントがあれば、ありがとうございます。

4

3 に答える 3

9

整数値を抽出し、それを 1 と比較して、またはそれに基づいて返すのboolValueではNSNumberなく、単にインスタンスの を返すだけです。たとえば、メソッド全体を次のように減らすことができます。YESNO

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

キーがユーザーのデフォルトに存在しない場合、このメソッドの結果は になりますNO

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

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

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

// or

if ([islog intValue] == 1)
    // do something
于 2012-05-13T20:42:07.403 に答える
5
if (islog == [NSNumber numberWithInt:(1)])

それは間違っている。(値ではなくアドレスを比較します)。

使用する:

if ([islog intValue] == 1)

代わりは。

于 2012-05-13T20:32:31.913 に答える
0

プロパティではなくメソッドとして呼び出します。

if([appDelegate getISlogged]){

(または、アプリ デリゲートでプロパティとして宣言します。)

于 2012-05-13T20:43:49.750 に答える