2012-06-19 20 views
13

से ब्लॉक को कैसे डालें, इसलिए, मैं एक ब्लॉक को NSAlertcontextInfo पैरामीटर के रूप में पास करने का प्रयास कर रहा हूं।शून्य *

[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; 
+0

मैं एक जवाब है, लेकिन मैं आपकी समस्या को पुन: पेश नहीं कर सकते। मुझे आश्चर्य है कि ऐसा क्यों है ... क्या आपके पास कोई अतिरिक्त चेतावनी/संकलन झंडे हैं? –

उत्तर

6

यहाँ एक छोटा सा उदाहरण है। मुझे लगता है कि अपने कोड के साथ समस्या यह है कि आप एक void * जो एआरसी के साथ प्रबंधित स्मृति नहीं है साथ __bridge_transfer उपयोग करने के लिए कोशिश कर रहे हैं कि:

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

    asBlock(); 
} 

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

'शून्य (^ प्रतिक्रियाब्लॉक)() = (__bridge टाइपफॉइडब्लॉकब्लॉक) contextInfo; 'मुझे' टाइपफॉफ़्टबैकब्लॉक' 'में' प्रतिक्रियाब्लॉक 'पर' सिंटैक्स त्रुटि: 'अपेक्षित') '' देता है। विचार? –

+0

@pcperini क्या आप फ़ंक्शन बिन में फ़ंक्शन की सामग्री पोस्ट कर सकते हैं? –

+0

प्रश्न के लिए पूरा कार्य जोड़ा गया। एक त्रुटि त्रुटि से एक पूर्ण उड़ा EXC_BAD_ACCESS में त्रुटि बदल गई है। –

संबंधित मुद्दे