我尝试调用某个块,但是我遇到了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
}
有关为何发生这种情况的任何想法?
答案 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
的更多详细信息