5

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

4 回答 4

15

如果您想调用该块,您可以简单地执行此操作block();而不是[block invoke];

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

于 2012-02-28T15:00:20.863 回答
9

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

@property (nonatomic, copy)   id block;
于 2012-02-28T15:22:19.563 回答
1

您必须将块放在堆上:

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

编辑: @murat 的回答也是正确的(而且可能更好)。一种或另一种方式,您必须复制块,因为块实际上是在堆栈上而不是在堆上创建的。

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

于 2012-02-28T15:21:33.703 回答
0

您可以像这样在 .h 文件中为 block 声明一个属性,它不会给出坏值 -

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

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

于 2012-03-26T11:00:56.383 回答