से ब्लॉक को कैसे डालें, इसलिए, मैं एक ब्लॉक को NSAlert
contextInfo
पैरामीटर के रूप में पास करने का प्रयास कर रहा हूं।शून्य *
[myAlert beginSheetModalForWindow: theWindow
modalDelegate: myAlert
didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:)
contextInfo: (void *) aBlock];
और दूसरे छोर पर इसे वापस प्राप्त:
void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo;
कौन सा, काम करता है एक हद तक। beginSheetModalForWindow:...
पर कॉल करने से पहले एबॉक 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 *
रों से सरल स्थानांतरण की खातिर डाली मिल ?
संपादित करें: उत्तर में सुझाए गए कास्ट विधियों का उपयोग करके पूर्ण प्रयास कोड। अब मुझे 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;
मैं एक जवाब है, लेकिन मैं आपकी समस्या को पुन: पेश नहीं कर सकते। मुझे आश्चर्य है कि ऐसा क्यों है ... क्या आपके पास कोई अतिरिक्त चेतावनी/संकलन झंडे हैं? –