2008-11-20 19 views
15

से ऑब्जेक्टिव सी विधि को कॉल करने में असमर्थ मैं एक जीयूआई अनुप्रयोग के लिए एमवीसी आर्किटेक्चर का उपयोग कर रहा हूं। मॉडल क्लास में कुछ सी फ़ंक्शन हैं। सी कार्यों में से एक उद्देश्य-सी वर्ग के कुछ तरीकों को बुलाता है। मैं उस वर्ग की वस्तु का उपयोग करके उन तरीकों को बुलाता हूं। अजीब चीज यह है कि पहले xyz विधि के तरीकों को पूरी तरह से कहा जाता है, लेकिन जब उस xyz विधि को कहा जाता है, तो उस विधि और विधियों को निष्पादित नहीं किया जा रहा है। मुझे कोई त्रुटि नहीं मिलती है। तो यह पता नहीं लगा सकता कि वास्तव में क्या हो रहा है। इस बारे में कोई विचार क्या है कि इसका क्या कारण हो सकता है?सी फंक्शन

+0

आप कुछ कोड पोस्ट कर सकते हैं ? अन्यथा मदद करना असंभव होगा। –

+0

मैं अनुरोध करता हूं कि दूसरा। कुछ सरल कोड बहुत उपयोगी होंगे। जैसे सी फ़ंक्शन का केवल कुछ कोड दिखाता है कि आप वास्तव में obj-c ऑब्जेक्ट को कैसे एक्सेस करते हैं और आप इसे कॉल कैसे करते हैं, – Mecki

उत्तर

1

आप निश्चित रूप से सी फ़ंक्शन से Obj-C ऑब्जेक्ट्स पर विधियों को चला सकते हैं, इसलिए संभव है कि किसी बिंदु पर आपके कोड में कोई त्रुटि हो। अगर मुझे लगता है, ऐसा लगता है कि एक ऑब्जेक्ट शून्य है जब आप इसकी उम्मीद नहीं करते हैं। आम तौर पर आप अपने फ़ंक्शन में ब्रेकपॉइंट्स सेट करके शुरू करेंगे, ताकि आप यह पता लगा सकें कि स्थिति में वस्तुएं क्या हैं।

55

जैसा कि मार्क बताता है, आप शायद ओबीजेसी ऑब्जेक्ट के संदर्भ का उपयोग कर रहे हैं जो उद्देश्य-सी दायरे के बाहर अन-प्रारंभिक है।

यहाँ सी कोड एक ObjC वस्तु की विधि बुला के एक कार्य नमूना है: xyz से पहले विधि पर

#import <Cocoa/Cocoa.h> 

id refToSelf; 

@interface SomeClass: NSObject 
@end 

@implementation SomeClass 
- (void) doNothing 
{ 
     NSLog(@"Doing nothing"); 
} 
@end 

int otherCfunction() 
{ 
     [refToSelf doNothing]; 
} 


int main() 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    SomeClass * t = [[SomeClass alloc] init]; 
    refToSelf = t; 

    otherCfunction(); 

    [pool release]; 
} 
+2

दोस्त बहुत उपयोगी हो सकता है, आप रॉक करते हैं। मैंने इस पर एक अच्छा दिन बर्बाद कर दिया और आपका कोड सिर्फ एक अन्यथा क्रोधित दिन बचा गया। काश मैं आपको 100 बार बार बढ़ा सकता हूं। – eviljack

+1

मुझसे एक और 100 अपवॉट्स! यह अविश्वसनीय रूप से सहायक था। – willc2

+1

बीटीडब्ल्यू यह केवल एक सिंगलटन के लिए काम करेगा। यदि आप एक से अधिक ऑब्जेक्ट को तुरंत चालू करते हैं जो reftooelf सूचक केवल अंतिम वस्तु को इंगित करेगा। – Brian

1

ब्रेकप्वाइंट, और फिर डीबगर में एकल स्टेपिंग शुरू करते हैं। यह आश्चर्यजनक है कि आप डीबगर में कोड के माध्यम से एकल कदम से कितनी बग स्पॉट कर सकते हैं। असल में, यह वास्तव में आपके द्वारा लिखे गए किसी भी नए कोड के कोड के माध्यम से कोड के माध्यम से एक चरण के लिए एक अनुशंसित बग टावरेंस तकनीक है।

मैं मार्क के साथ सहमत हूं, "उस विधि का क्लासिक कारण और इसे निष्पादित नहीं होने के बाद के तरीके" यह है कि ऑब्जेक्ट संदर्भ शून्य है, क्योंकि [nil doAnything] कुछ भी नहीं करेगा और कोई त्रुटि रिपोर्ट नहीं करेगा।

0

ऐसा करने के लिए एक आसान तरीका है: स्वयं के साथ init

@implementation 
// Define a object 
ClassName *thisClass; 

और फिर

thisClass = self; 

आप सी-विधि में किसी भी वर और तरीकों का उपयोग कर सकते

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