NSAlert
contextInfo
そのため、ブロックをパラメーターとして渡そうとしています。
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (void *) aBlock];
反対側でそれを取り戻します:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;
これはある程度機能します。beginSheetModalForWindow:...
aBlockへの呼び出しが at になる前0x00007fff610e1ec0
、および応答 ( alertDidEnd:...
) では、contextInfo は at0x00007fff610e1ec0
です。
ただし、ブロックを呼び出そうとすると:
responseBlock();
次のエラーが表示されます
エラー: 呼び出されたオブジェクト型 '__block_literal_generic *' は関数または関数ポインターではありません
エラー: 式の解析中に 1 つのエラーが発生しました
void *
単純な転移のためにブロックを from に適切にキャストするにはどうすればよいでしょうか?
編集:
回答で提案されているキャストメソッドを使用して、完全に試行されたコード。呼び出しで EXC_BAD_ACCESS エラーが表示されるようになりましたresponseBlock();
。
- (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;
}
}
}
その他注意事項:
を使用する場合、と__bridge
のメモリ アドレスは異なりますが、 を使用する場合は同じです。どちらも EXC_BAD_ACCESS の問題を軽減しません。responseBlock
contextInfo
__bridge_transfer
働く:
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (__bridge_retained void *) [aBlock copy]];
以降...
void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo;