2011-04-27 10 views
7

हे सब! मैं उद्देश्य-सी के लिए काफी नया हूं इसलिए मुझे इस मुद्दे से अभी तक निपटना नहीं पड़ा है। मेरे पास मेरे उद्देश्य-सी वर्ग में एक सी फ़ंक्शन है और मैं युक्त उद्देश्य-सी कक्षा की संपत्ति पर एक विधि कॉल करने में सक्षम होना चाहता हूं।मैं सी फंक्शन को उद्देश्य-सी में 'स्वयं' (कॉलिंग ओबीजे) को पॉइंटर कैसे दे सकता हूं?

मैं समझता हूँ कि मेरी सी समारोह नहीं समझोगे कि क्या 'स्वयं' है अगर मैं मुझे लगता है मैं करने के लिए एक सूचक दे ​​रहा है मेरी सी समारोह की जरूरत क्या सिर्फ एक संदेश [self.delegate DoSomething]

भेजने का प्रयास मेरी कक्षा में तो मैं ऐसा कुछ कर सकता हूं:

myClass-> प्रतिनिधि -> doSomething();

मैं एक वैश्विक चर में वर्तमान ऑब्जेक्ट (स्वयं) में एक सूचक को स्टोर करना चाहता हूं क्योंकि मैं फ़ंक्शन हस्ताक्षर को बदलने में सक्षम नहीं हूं। मैं इस वर्ग के भीतर परिभाषित किसी भी सी फ़ंक्शन से पॉइंटर तक पहुंचने में सक्षम होना चाहता हूं। इसका कारण यह है कि मैं एक सी पुस्तकालय के चारों ओर एक रैपर लिख रहा हूं जिसे मैं उपयोग करने की कोशिश कर रहा हूं। अगर इसकी मदद की जा सकती है .. मैं इस पुस्तकालय में स्रोत को संशोधित नहीं करना चाहता हूं।

क्या कोई मेरी वर्तमान वस्तु को पॉइंटर प्राप्त करने के तरीके में मदद कर सकता है? धन्यवाद!

void event_privmsg (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) 
{ 
    //[self.delegate privateMessage]; I would like to do the following 
} 

उत्तर

16

self किसी विधि के अंदर मौजूदा विधि के ऑब्जेक्ट के लिए एक सूचक है। तो तुम एक वैश्विक चर अपने वर्ग के रूप में आपके द्वारा लिखा गया है कि प्रदान कर सकते हैं:

// Global scope 
static MyClass *globalSelf; 

// C function 
void foo() { 
    [globalSelf->delegate doSomething]; 
} 

// ObjC method 
- (void)setMyselfUpAsTheGlobalVariable { 
    globalSelf = self; 
    foo(); 
} 

यह काम करना चाहिए, मैं कहना चाहिए कि इस बल्कि बदसूरत है और आप सावधान है कि वैश्विक चर के लिए जा रहा नहीं है होना जरूरी समवर्ती कोड द्वारा trampled हो जाओ। अधिकांश सी-स्टाइल एपीआई आपको void* वैरिएबल को उपयोगकर्ता द्वारा परिभाषित पैरामीटर के रूप में पास करने देगी। यदि यह एपीआई के साथ सच है कि आप लपेट रहे हैं, तो यह वैश्विक चर के बजाय उद्देश्य-सी ऑब्जेक्ट उदाहरण को संग्रहीत करने के लिए आदर्श जगह होगी।

+0

इम दे एक दृश्य। दुर्भाग्य से मेरी पोस्ट में सी फ़ंक्शन वास्तविक हस्ताक्षर है और जैसा कि आप देख सकते हैं, यह उपयोगकर्ता परिभाषित var को समायोजित नहीं करता है। उत्तर – Nick

0

MyObjectiveCClass self; 

नीचे के रूप में यह घोषित Obj सी समारोह

void event_privmsg (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count) 
{ 
    [self.delegate privateMessage]; //I would like to do the following 
} 

कॉल करने के लिए भी पोस्ट की जांच स्वयं निर्वासन चर का प्रयोग करें,

Unable to call an Objective C method from a C function

+0

के लिए धन्यवाद एक संकलक त्रुटि में उपरोक्त परिणाम: किसी ऐसे संगठन में सदस्य 'प्रतिनिधि' के लिए अनुरोध जो संरचना या संघ नहीं है। – Nick

+0

यह इस तथ्य के कारण है कि प्रकार आईडी के रूप में घोषित var के साथ सदस्य अज्ञात है। – Nick

+0

@ निक: ठीक है, आप आईडी के बजाय अपना वर्ग नाम प्राप्त कर सकते हैं। – Jhaliya

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