我有一个Cocoa / Objective-C类,其方法看起来像这样:
- (void)doWork:(void (^)(void))handler
{
[self->someObject doActualWork:kWorkID handler:^(Result *result) {
if (handler)
handler();
}];
}
但是,当调用内部块时handler
已被释放,并且程序在调用时崩溃。据我所知,这是因为块存储在堆栈中,因此在doWork:
完成后很快就被删除了。我正在使用ARC。我该怎么做才能解决这个问题?
答案 0 :(得分:4)
首先,iVar访问的self->
通常是一种奇怪的,不鼓励的模式。
您是否在存储之前复制了这些块以供以后使用?如果这是异步代码,那么你的actualWork:handler:
方法应该在排队之前复制该块。
即使在ARC下;当ARC自动处理方法中块的返回时,它不能自动处理块作为参数,你仍然需要复制'em。
如果这是纯粹的同步代码,那么其他东西就会出错。你需要提供更多线索。