2010-08-26 13 views
10

यहाँ मेरी उद्देश्य-सी वर्ग हैं:उद्देश्य-सी कॉल फ़ंक्शन किसी अन्य वर्ग पर?

AppDelegate 
SomeScript 

मैं कैसे एप्लिकेशन-प्रतिनिधि या किसी अन्य वर्ग से SomeScript वर्ग पर समारोह loggedIn कॉल कर सकते हैं?

धन्यवाद, ईसाई स्टीवर्ट

उत्तर

37

(मैं loggedIn मान लेंगे कोई पैरामीटर लेने एक उदाहरण विधि है।) पहले,:

  1. वे 'कार्यों नहीं कर रहे हैं, वे तरीकों (एक ही विचार है, हालांकि) कर रहे हैं।
  2. आप तरीकों फोन नहीं है, आप संदेशों (आमतौर पर एक ही विचार है, हालांकि) भेजने
  3. सबसे महत्वपूर्ण बात, हम आम तौर पर संदेश नहीं वर्गों के लिए भेजने के लिए, लेकिन उदाहरणों उन वर्गों के करने के लिए। (आप अंतर कल्पना नहीं कर सकते, अपने मेलबॉक्स में एक पत्र रखने बनाम मेलबॉक्स के विचार में एक पत्र रखने की कल्पना। केवल एक समझ में आता है!)

तो, हमारी नई योजना है पहले इन्स्तांत SomeScript, तो उदाहरण के लिए एक संदेश भेजें।

SomeScript* myScript = [[SomeScript alloc] init]; //First, we create an instance of SomeScript 
[myScript loggedIn]; //Next, we send the loggedIn message to our new instance 

यह अच्छा है। तथापि! मैं शर्त लगाता हूं कि आप अपनी स्क्रिप्ट को बाद में उपयोग के लिए चिपकाना चाहते हैं। इस प्रकार, हमें वास्तव में इसे अपने ऐप प्रतिनिधि का एक उदाहरण चर बनाना चाहिए। तो, इसके बजाय, AppDelegate में।ज, ब्रेसिज़ के अंदर इस जोड़ें:

SomeScript* myScript; 

अब हमारे चर रहेंगे, और इससे पहले से हमारी पहली लाइन बस हो जाता है:

myScript = [[SomeScript alloc] init]; 

अंतिम जटिलता: हम एक नया बनाने के लिए नहीं करना चाहते हैं प्रत्येक बार जब हम loggedIn (मुझे लगता है) कहते हैं तो स्क्रिप्ट! इसलिए, आपको कहीं भी तत्काल स्थान देना चाहिए, यह केवल एक बार चलाया जाएगा (उदाहरण के लिए, application:DidFinishLaunchingWithOptions:)। टा-दा!

+0

आपको मेरी स्क्रिप्ट – JeremyP

+0

@ जेरेमीपी जारी करने पर कुछ जोड़ने की आवश्यकता है: यह उसके ऐपडिलेग में है। @ क्रिस्टियन स्टीवर्ट: जेरेमी का अधिकार, आपको आमतौर पर 'रिलीज' को 'myScript' पर भेजना चाहिए जब आप इसके साथ काम करेंगे। मैंने आपको नहीं बताया क्योंकि मुझे लगता है कि आप इसका उपयोग पूरे समय अपने ऐप के खुले होने पर करेंगे। – andyvn22

+0

यह अच्छी आदतों में पाने के लिए कोई नुकसान नहीं करता है। तकनीकी रूप से, आपको अपने ऐप प्रतिनिधि को कुछ भी जारी करने की आवश्यकता नहीं है क्योंकि ऐप प्रतिनिधि स्वयं अंत तक रहता है। हालांकि, रिलीज डालने की आदत में प्रवेश करना एक अच्छा विचार है। इसे स्वचालित बनने की जरूरत है। – JeremyP

3

आप (मान आप SomeScript एक Singleton वर्ग अपने AppDelegate तरह की जरूरत नहीं है) अपने AppDelegate कक्षा में एक SomeScript वस्तु का एक प्रारंभ संदर्भ होगा। कुछ की तरह:

SomeScript * myScript;

अपने AppDelegate इंटरफ़ेस में एक इवर रूप

, जबकि अपने application:DidFinishLaunchingWithOptions:

आप इसे inited है (के डिफ़ॉल्ट alloc/init कॉम्बो बुला के साथ लगता है):

myScript = [[SomeScript alloc] init]

यह सब किया गया, जब आपको मेरी स्क्रिप्ट की विधि कॉल करने की आवश्यकता होती है तो आप बस कर सकते हैं:

[myScript myMethod:myParameter]

Here आप कई शब्दावली मुद्दों एप्पल से शुरुआती के लिए एक अच्छी गाइड पा सकते हैं

1

यदि आप कुछ स्क्रिप्ट के उदाहरणों का उपयोग नहीं करना चाहते हैं ... तो आप एक अलग दृष्टिकोण का पालन कर सकते हैं। अपने कुछ स्क्रिप्ट ऑब्जेक्ट में अधिसूचना भेजने के लिए NSNotificationCenter का उपयोग करें और उसके बाद इसे एक चयनकर्ता चलाएं।

अपने में - (शून्य) awakeFromNib {} विधि, SomeScript से जगह निम्नलिखित कोड:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(mySelector:) 
               name:@"aUniqueNameForTheNotification" 
               object:nil]; 

विधि बनाएँ "mySelector:" और अपने loggedIn विधि करने के लिए कॉल करने के लिए।

-(void) mySelector:(id)elem 
{ 
    [self loggedIn]; 
} 

तो मत भूलना dealloc पर पर्यवेक्षक दूर करने के लिए है, तो भी अपने SomeScript कक्षा में कोड का निम्न भाग जगह: (loggedIn के साथ सीधे या यदि आप चाहें, तो आप बदल सकते "mySelector"):

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

तो फिर तुम तो जैसे किसी अन्य से एक सूचना भेज सकते हैं: कोड के अंतिम टुकड़ा SomeScript करने के लिए एक सूचना भेजता है और अपने चयनकर्ता निष्पादित किया जाता है

[[NSNotificationCenter defaultCenter] postNotificationName:@"aUniqueNameForTheNotification" object:self]; 

है।

आशा है कि यह आपको लोगों की मदद करेगी!

1

हम जब loggedIn विधि SomeScript कक्षा में है [self loggedIn]
है जैसे कि यह कॉल कर सकते हैं, नवीनतम xcode में सरल वाक्यविन्यास का उपयोग कर।

[[SomeScript new] loggedIn]; 
+0

क्या इसे बाद में हटाने की आवश्यकता है? मुझे लगता है कि एआरसी के साथ कोई रास्ता नहीं है .. – durazno

+1

एआरसी के साथ कोई डीलोकेशन आवश्यक नहीं है। –

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