我完全被这个难住了,希望有人能帮我:
甲级:
- (void)setBlock:(BOOL(^)(id sender))block {
myBlock = Block_copy(block);
}
- (BOOL)runBlock:(id)sender {
myBlock(sender);
}
B类:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotificationx {
//The outer block provides behaviour according to strategy pattern:
[classAInstance setBlock:^BOOL(id sender) {
NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
//The inner block is a special case of behaviour where I want the task to run asynchronously:
[queue addOperationWithBlock:^(void) {
NSLog(@"sender: %@", [sender class]);
[sender doSomething];
}];
return YES;
}];
}
稍后当一个gui事件导致classainstance调用
- (BOOL)runBlock;
(它应该是)我得到以下崩溃堆栈:
0 objc_exception_throw
3 __forwarding_prep_0___
4 __58-[ClassB applicationDidFinishLaunching:]_block_invoke_037
5 -[NSBlockOperation main]
11 start_wqthread
最后一个调试日志是:
sender: __NSMallocBlock__
-[__NSMallocBlock__ doSomething]: unrecognized selector sent to instance 0x10043f2a0
那么,为什么block的论点一开始就突然变成了
__NSMallocBlock__
?我显然是在传递别的东西(即
sender
),不是吗? 最佳答案
看起来,当您调用runblock时,您将传递一个块作为发送者。我能很好地运行你的代码。Matt Gallagher有一篇关于How blocks are implemented的文章,可以帮助您调试问题。
如果复制nsstackblock,它将返回nsmallocblock
(指示其已更改的分配位置)。