调用阻止iOS

时间:2012-02-28 14:50:52

标签: objective-c ios objective-c-blocks nsinvocation

我尝试调用某个块,但是我遇到了EXC_BAD_ACCESS。

-(void) methodA {
   self.block = ^ {
       [self methodB];
   };
}

-(void) webViewDidFinishLoad:(UIWebView *)webView {
       [block invoke]; // error here (block is not valid id type).
}

-(void)methodB {
    //do something
}

有关为何发生这种情况的任何想法?

4 个答案:

答案 0 :(得分:15)

如果你想调用阻止,你只需执行此操作block();而不是[block invoke];

有关详细信息,请参阅Block Programming Topics

答案 1 :(得分:9)

在声明块属性时应使用copy属性。像:

@property (nonatomic, copy)   id block;

答案 2 :(得分:1)

你必须将块放在堆上:

self.block = Block_copy(^{
    [self someMethod];
});

编辑: @ murat的回答也是正确的(可能更好)。无论如何,你必须复制块,因为块实际上是在堆栈上而不是堆上创建的。

有关您想要保留的块的更多信息,请参阅文档中的"Copying Blocks" and "Patterns to Avoid"

答案 3 :(得分:0)

你可以像这样在.h文件中为block声明一个属性,它不会给出过多的错误 -

    typedef int (^devideEquallyBlock)(int);
    @property (nonatomic, copy) devideEquallyBlock callbackBlock;

请确保声明副本不保留,以获取有关如何声明属性blocks programming in ios/objective-c

的更多详细信息