3

ブロック内のインスタンス変数にアクセスしたいのですが、常にブロック内で EXC_BAC_ACCESS を受け取ります。自分のプロジェクトでは ARC を使用していません。

.h file

@interface ViewController : UIViewController{
    int age; // an instance variable
}



.m file

typedef void(^MyBlock) (void);

MyBlock bb;

@interface ViewController ()

- (void)foo;

@end

@implementation ViewController

- (void)viewDidLoad{
    [super viewDidLoad];

    __block ViewController *aa = self;

    bb = ^{
        NSLog(@"%d", aa->age);// EXC_BAD_ACCESS here
        // NSLog(@"%d", age); // I also tried this code, didn't work
    };

    Block_copy(bb);

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(10, 10, 200, 200);
    [btn setTitle:@"Tap Me" forState:UIControlStateNormal];
    [self.view addSubview:btn];

    [btn addTarget:self action:@selector(foo) forControlEvents:UIControlEventTouchUpInside];
}

- (void)foo{
    bb();
}

@end

ブロック プログラミングに慣れていません。コードの問題は何ですか?

4

2 に答える 2

1

スコープ外のスタックに割り当てられたブロックにアクセスしています。bbコピーしたブロックに割り当てる必要があります。bbクラスのインスタンス変数にも移動する必要があります。

//Do not forget to Block_release and nil bb on viewDidUnload
bb = Block_copy(bb);
于 2012-10-10T17:22:49.140 に答える
0

ageivarに適切なアクセサ メソッドを定義する必要があります。

@interface ViewController : UIViewController{
  int age; // an instance variable
}
@property (nonatomic) int age;
...

あなたの.mファイルで:

@implementation ViewController
@synthesize age;
...

そして、次のように使用します:

    NSLog(@"%d", aa.age);// EXC_BAD_ACCESS here

ブロックが実行される前にそのインスタンスが割り当て解除されないようにViewControllerを適切に割り当てると、これで修正されます。

于 2012-10-10T17:14:57.973 に答える