1

ブロックを使用して、いくつかの入力イベントに関連してインスタンス変数を更新してみたかったのです。

私のUIViewControllerクラスでは:

@interface ViewController : UIViewController{
    CGPoint touchPoint;
    void (^touchCallback)(NSSet* touches);
}
@property(readwrite) CGPoint touchPoint;
@end

実装ファイル内:

-(id) init{
if (self = [super init]){
    touchCallback = ^(NSSet* set){
        UITouch * touch= [set anyObject];
       self.touchPoint = [touch locationInView:self.view];
         };
   }
   return self;
}

コールバック関数では、ブロックを使用します:

-(void)touchesBegin:(NSSet *)touches withEvent:(UIEvent *)event{
    touchCallback(touches);
}

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    touchCallback(touches);  
}

いくつか試してみましたが、selfインスタンスを使用するとBAD_ACCESSが発生します。どこが問題なのかわかりません。

4

1 に答える 1

1

ブロックをコピーする必要があります。

- (id)init {
    if (self = [super init]) {
        touchCallback = [^(NSSet* set){
            UITouch * touch= [set anyObject];
            self.touchPoint = [touch locationInView:self.view];
        } copy];
    }
    return self;
}

これは、そのブロックがスタック上に作成され、後で使用する場合は、コピーを作成してヒープにコピーする必要があるためです。(ブロックは、ifステートメントスコープの最後で「消える」でしょう)

于 2012-10-26T16:21:11.003 に答える