从内部块中调用块

时间:2012-01-02 18:25:36

标签: objective-c cocoa automatic-ref-counting

我有一个Cocoa / Objective-C类,其方法看起来像这样:

- (void)doWork:(void (^)(void))handler
{
    [self->someObject doActualWork:kWorkID handler:^(Result *result) {
        if (handler)
            handler();
    }];
}

但是,当调用内部块时handler已被释放,并且程序在调用时崩溃。据我所知,这是因为块存储在堆栈中,因此在doWork:完成后很快就被删除了。我正在使用ARC。我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:4)

首先,iVar访问的self->通常是一种奇怪的,不鼓励的模式。

您是否在存储之前复制了这些块以供以后使用?如果这是异步代码,那么你的actualWork:handler:方法应该在排队之前复制该块。

即使在ARC下;当ARC自动处理方法中块的返回时,它不能自动处理块作为参数,你仍然需要复制'em。

如果这是纯粹的同步代码,那么其他东西就会出错。你需要提供更多线索。