调用阻止iOS

我尝试调用一些块,但我遇到了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 } 

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

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

 @property (nonatomic, copy) id block; 

如果你想调用块你可以简单地做这个block(); 而不是[block invoke];

有关更多详细信息,请参阅块编程主题

你必须把块放在堆上:

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

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

有关要保留的块的更多信息,请参阅文档中的“复制块”和“要避免的模式” 。

你可以像这样在.h文件中声明一个块的属性,它不会给出过多的 –

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

请确保声明副本不保留,以获取有关如何在ios / objective-c中声明属性块编程的更多详细信息