所以,我想傳遞一個塊作爲NSAlert
contextInfo
參數。如何投放塊和無效*
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (void *) aBlock];
,並把它找回來的另一端:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;
其中,工程的程度。我呼籲beginSheetModalForWindow:...
ABLOCK之前在0x00007fff610e1ec0
,並在響應(alertDidEnd:...
),contextInfo是0x00007fff610e1ec0
。
然而,當我嘗試調用該塊:
responseBlock();
我收到以下錯誤
error: called object type '__block_literal_generic *' is not a function or function pointer
error: 1 errors parsing expression
一個人如何正確地投塊到從void *
S表示簡單轉移的緣故?
編輯: 全部試圖代碼,使用的答案建議投的方法。我現在收到關於responseBlock();
調用一個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;
}
}
}
其他註釋: 當使用__bridge
,的responseBlock
存儲器地址和contextInfo
是不同的,而用__bridge_transfer
,它們是相同的。既不緩解EXC_BAD_ACCESS問題。
工作:
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (__bridge_retained void *) [aBlock copy]];
後來......
void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo;
我有一個答案,但我無法重現你的問題。我想知道爲什麼這是...你有任何額外的警告/編譯標誌? –