我完全被这个难住了,希望有人能帮我:
甲级:

- (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
(指示其已更改的分配位置)。

08-05 21:49