所以,我试图通过一个块作为NSAlert contextInfo参数。

[myAlert beginSheetModalForWindow: theWindow
                    modalDelegate: myAlert
                   didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
                      contextInfo: (void *) aBlock];

把它放回另一端:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;

这在一定程度上起作用。在我调用beginSheetModalForWindow:...ablock之前,在响应(0x00007fff610e1ec0)中,contextinfo位于alertDidEnd:...
但是,当我试图调用块时:
responseBlock();

我得到以下错误
错误:被调用的对象类型'y*BubxLimalAlgNy**不是函数或函数指针
错误:解析表达式时出现1个错误
为了简单的转移,一个人如何正确地将块投射到from0x00007fff610e1ec0s?
编辑:
完整的尝试代码,使用答案中建议的转换方法。我现在在void *呼叫中收到一个exc_bad_access错误。
- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
    void (^responseBlock)() = (__bridge typeof(responseBlock)) contextInfo;

    switch (returnCode)
    {
        case NSCancelButton:
        {
            break;
        }

        case NSOKButton:
        {
            responseBlock();
            break;
        }
    }
}

其他说明:
当使用responseBlock();时,__bridgeresponseBlock的内存地址不同,而contextInfo,它们是相同的。这两个问题都不能缓解Excel BADIAccess问题。
工作:
[myAlert beginSheetModalForWindow: theWindow
                    modalDelegate: myAlert
                   didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
                      contextInfo: (__bridge_retained void *) [aBlock copy]];

后来…
void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo;

最佳答案

这里有一个小例子。我认为您的代码的问题在于您试图将__bridge_transfervoid *一起使用,而不是由arc管理的内存:

void takesBlock(void *asPointer)
{
    void (^asBlock)() = (__bridge typeof asBlock) asPointer;

    asBlock();
}

int main()
{
    @autoreleasepool {
        takesBlock((__bridge void *)[^{
            NSLog(@"Hello World!");
        } copy]);
    }
}

10-04 17:57