所以,我试图通过一个块作为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个错误
为了简单的转移,一个人如何正确地将块投射到from
0x00007fff610e1ec0
s?编辑:
完整的尝试代码,使用答案中建议的转换方法。我现在在
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();
时,__bridge
和responseBlock
的内存地址不同,而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_transfer
与void *
一起使用,而不是由arc管理的内存:
void takesBlock(void *asPointer)
{
void (^asBlock)() = (__bridge typeof asBlock) asPointer;
asBlock();
}
int main()
{
@autoreleasepool {
takesBlock((__bridge void *)[^{
NSLog(@"Hello World!");
} copy]);
}
}