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

age您应该为您的ivar定义正确的访问器方法:

@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 回答