तकनीकी रूप से, आप ब्लॉक के लिए फ़ंक्शन पॉइंटर तक पहुंच प्राप्त कर सकते हैं। लेकिन ऐसा करने के लिए यह पूरी तरह से असुरक्षित है, इसलिए मैं निश्चित रूप से इसकी अनुशंसा नहीं करता हूं। देखने के लिए कैसे, निम्न उदाहरण पर विचार करें:
#import <Foundation/Foundation.h>
struct Block_layout {
void *isa;
int flags;
int reserved;
void (*invoke)(void *, ...);
struct Block_descriptor *descriptor;
};
int main(int argc, char *argv[]) {
@autoreleasepool {
// Block that doesn't take or return anything
void(^block)() = ^{
NSLog(@"Howdy %i", argc);
};
// Cast to a struct with the same memory layout
struct Block_layout *blockStr = (struct Block_layout *)(__bridge void *)block;
// Now do same as `block()':
blockStr->invoke(blockStr);
// Block that takes an int and returns an int
int(^returnBlock)(int) = ^int(int a){
return a;
};
// Cast to a struct with the same memory layout
struct Block_layout *blockStr2 = (struct Block_layout *)(__bridge void *)returnBlock;
// Now do same as `returnBlock(argc)':
int ret = ((int(*)(void*, int a, ...))(blockStr2->invoke))(blockStr2, argc);
NSLog(@"ret = %i", ret);
}
}
चल रहा है कि पैदावार:
Howdy 1
ret = 1
कौन सा है कि हम क्या विशुद्ध रूप से block()
के साथ सीधे उन ब्लॉकों को क्रियान्वित करने से उम्मीद थी। तो, आप अपने फ़ंक्शन पॉइंटर के रूप में invoke
का उपयोग कर सकते हैं।
लेकिन जैसा कि मैंने कहा, यह पूरी तरह से असुरक्षित है। वास्तव में इसका उपयोग न करें!
आप क्या कह रहे हैं करने के लिए एक रास्ते से एक लेख को देखने के लिए चाहते हैं, तो इस बाहर की जाँच: http://www.mikeash.com/pyblog/friday-qa-2010-02-12-trampolining-blocks-with-mutable-code.html
यह आपको बस इतना करना होगा का सिर्फ एक महान लेख है इसे काम करने के लिए। अफसोस की बात है, यह कभी भी आईओएस पर काम नहीं करेगा (क्योंकि आपको किसी पृष्ठ को निष्पादन योग्य के रूप में चिह्नित करने की आवश्यकता है जिसे आपको अपने ऐप के सैंडबॉक्स में करने की अनुमति नहीं है)। लेकिन फिर भी, एक महान लेख।
कृपया मेरी अज्ञानता से क्षमा करें, लेकिन यह वास्तव में असुरक्षित क्यों है? मुझे लगता है कि ऐसा इसलिए है क्योंकि संरचना एक आंतरिक है और भविष्य में बदल सकती है, है ना? –
यह सही है :-)। – mattjgalloway
इसके साथ समस्या यह है कि आपको अभी भी ब्लॉक को इनवॉक फ़ंक्शन में पास करने की आवश्यकता है, जबकि ओपी का कहना है कि आप कॉलबैक में कोई संदर्भ नहीं दे सकते हैं। – newacct