0

私はC#での重いUI作業から来て、iosを初めて使用しています。コードのいくつかのロジックに基づいて、どのボタンを有効にするか無効にするかを制御したいアプリがあります。これを行うために、次のようにボタンの状態を処理する小さなメソッドを作成しました。

-(void)activateUI:(BOOL *)activate {

    [ validateDataBtn setEnabled: *activate ] ;
    [ modifyCompDataBtn setEnabled: *activate ] ;
    [ saveCompDataBtn setEnabled: *activate ] ;
}

これらの IBOutlets はすべて、次のように UI ボタン​​にバインドされます。

__weak IBOutlet UIButton *saveCompDataBtn;
__weak IBOutlet UIButton *modifyCompDataBtn;
__weak IBOutlet UIButton *validateDataBtn;

アプリを実行すると、メソッドの最初の行で例外が発生します。

[ validateDataBtn setEnabled: *activate ] ;

エラーは EXC_BAD_ACCESS (コード = 2、アドレス = 0X0) です。何が間違っていますか?

4

2 に答える 2

1

なぜだめですか

- (void)activateUI:(BOOL)activate {
    [validateDataButton setEnabled:activate];
    // etc...
}

アクティブ化へのポインターを使用する必要がある理由がわかりませんBOOL...

編集:

スカラー アクセスとポインター アクセスの例:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

@interface Foo:NSObject
@property (nonatomic, retain) NSTextField *field;
- (void)activateUI:(BOOL *)activate;
- (void)activateUIScalar:(BOOL)activate;
@end

@implementation Foo
@synthesize field;

- (void)activateUI:(BOOL *)activate {
    NSLog(@"%s - setting to: %d",__FUNCTION__,*activate);
    [[self field] setEnabled:*activate];
}

- (void)activateUIScalar:(BOOL)activate {
    NSLog(@"%s - setting to %d (scalar)",__FUNCTION__, activate);
    [[self field] setEnabled:activate];
}

@end

int main(int argc, char *argv[]) {
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

    BOOL flag = NO;
    Foo *myFoo = [Foo new];
    [myFoo activateUI:&flag];

    flag = YES;
    [myFoo activateUI:&flag];

    //  now using scalar (99.999% of the time the right way)
    [myFoo activateUIScalar:YES];
    [myFoo activateUIScalar:NO];

    [myFoo release];
    [p release];
}

以下をコンソールに出力します。

2012-10-20 14:49:14.228 Untitled 4[27444:707] -[Foo activateUI:] - setting to: 0
2012-10-20 14:49:14.230 Untitled 4[27444:707] -[Foo activateUI:] - setting to: 1
2012-10-20 14:49:14.230 Untitled 4[27444:707] -[Foo activateUIScalar:] - setting to 1 (scalar)
2012-10-20 14:49:14.231 Untitled 4[27444:707] -[Foo activateUIScalar:] - setting to 0 (scalar)
于 2012-10-20T19:32:20.550 に答える
1

編集:私の、私の。私はこれをどれだけひどく台無しにしたかを理解しました。

不正解:まず、 を使用すべきではありません。BOOL *使用したことがある場合は、 ではなくBOOL *として参照します。C/Objective-C の は、変数がポインターであることを意味します。メモリのブロックへのアドレスが含まれています。ポインターを逆参照して、反対側の値にアクセスします。&activate*activate*&

正解: An*は、引数がポインターであることを示し、ポインターを参照するためにも使用されます。変数の&前の は、メモリ内の変数のアドレスを使用することを示します。私はそれらを混ぜました。これは、元のコードが正しいことを意味します。問題は、おそらく[self activateUI:someBOOL]BOOL を渡す を使用して呼び出すことであり、*.

<object type> *オブジェクトのインスタンスを処理するために使用されるすべての変数がポインターであるため、オブジェクトが as として渡されるため、混乱する可能性があります。ただし、BOOL は にtypedef編集されます。intこれはプリミティブであるため、*必要ありません。あなたの方法は次のとおりです。

- (void) activateUI:(BOOL)activate {
    [validateDataBtn setEnabled: activate];
    [modifyCompDataBtn setEnabled: activate];
    [saveCompDataBtn setEnabled: activate];
}

//called like this: [self activateUI: someBOOL];

本当に a へのポインタを引数として渡すつもりBOOLだった場合は、最初に書いたものを使用しますが、次のように呼び出す必要があります。

[self activateUI: &someBOOL];

BOOL( )へのポインターを取得するメソッドを宣言し、BOOL *メソッド本体 ( ) 内で逆参照する場合は、それ自体ではなく( ) に*someBOOLアドレスを渡す必要があります。自身を取るメソッドを宣言し(単に)、それをメソッド本体で直接使用する場合 ( )、自身を渡す必要があります ( )。BOOL&someBOOLBOOLBOOLBOOLsomeBOOLBOOLsomeBOOL

于 2012-10-20T19:34:45.380 に答える