I have a Cocoa/Objective-C class with a method that looks something like this:
- (void)doWork:(void (^)(void))handler
{
[self->someObject doActualWork:kWorkID handler:^(Result *result) {
if (handler)
handler();
}];
}
However, when the inner block is called handler have been dealloced and the program crashes when it is called. From what I understand this is because the block is stored on the stack and thus removed soon after doWork: finishes. I’m using ARC. What should I do to fix this?
First,
self->for iVar access is an odd, and discouraged, pattern, generally.Did you copy the blocks prior to storing ’em away for use later? If this is intended to be asynchronous code, then your
actualWork:handler:method should be copying the block prior to enqueueing it.Even under ARC; while ARC handles the return of blocks from methods automatically, it can’t handle blocks as arguments automatically and you do still need to copy ’em.
If this is purely synchronous code, then something else is going wrong. You’ll need to provide more clues.