2009-06-25 11 views
49
  1. क्या किसी को पता है कि मैं objective-C में एक और प्रतिनिधि प्रतिनिधि कैसे काम करता है और कैसे एक अच्छा स्पष्टीकरण/ट्यूटोरियल ढूंढ सकता हूं?
  2. मेरी दो पुस्तकें delegates पर पर्याप्त नहीं हैं और उन्हें अपनी शक्ति और कार्य को वास्तव में समझने के लिए बहुत अच्छी तरह से व्याख्या नहीं करती है।
+0

आप "आवेदन प्रतिनिधि" लिखने लेकिन मुझे लगता है कि इस सवाल का विशेष रूप से एक कोको आवेदन की साझा NSApplication वस्तु के प्रतिनिधि के बारे में नहीं है? –

उत्तर

77

संदेह होने पर, docs जाँच!

असल में, प्रतिनिधिमंडल वस्तुओं के बीच मजबूत परस्पर निर्भरता पैदा किए बिना एक-दूसरे के साथ बातचीत करने की अनुमति देने का एक तरीका है, क्योंकि इससे आपके आवेदन का डिज़ाइन कम लचीला हो जाता है। वस्तुओं को एक दूसरे को नियंत्रित करने के बजाय, वे एक प्रतिनिधि हो सकते हैं जो वे संदेश भेजते हैं (या प्रतिनिधि) संदेश भेजते हैं, और प्रतिनिधि जो कुछ भी करता है, वह इस संदेश का जवाब देने और कार्य करने के लिए करता है, और फिर आम तौर पर किसी अन्य वस्तु पर वापस लौटाता है ।

प्रतिनिधिमंडल उप-वर्गीकरण के लिए एक बेहतर विकल्प भी है। अन्य वस्तुओं के व्यवहार के तरीके को बदलने या उन्हें डेटा पास करने के तरीके के बदले में अपनी खुद की कस्टम कक्षाएं बनाने के बजाय, प्रतिनिधिमंडल ऑब्जेक्ट्स को उनके प्रतिनिधियों को संदेश भेजने की अनुमति देता है ताकि वे उप-वर्ग बनाने में उपरोक्त परिवर्तन किए बिना उप-वर्ग बनाने के ऊपरी हिस्से के बिना काम कर सकें अन्य वस्तुओं।

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

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

+0

धन्यवाद ... मैं आदमी पृष्ठों पहले जब मैं देख रहा था में प्रतिनिधियों के बारे में कुछ भी नहीं मिला। मान लीजिए कि मैं गलत खंड में था। –

+0

मैन पेजों में Objective-C के बारे में आपको कुछ भी खोजने की संभावना नहीं है। ऐप्पल के ऑनलाइन दस्तावेज़ न केवल कोको के विनिर्देशों के लिए, बल्कि वैचारिक पृष्ठभूमि के लिए भी एक निश्चित स्रोत हैं। –

+0

@ क्विन टेलर: हाँ, इसे बदल दिया। मैं संदर्भ में बात कर रहा था हालांकि हां, आम तौर पर प्रतिनिधिमंडल के बारे में बात करते समय यह लागू नहीं होता है। –

12

प्रतिनिधि एक डिजाइन पैटर्न हैं; कोई विशेष वाक्यविन्यास या भाषा समर्थन नहीं है।

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

20

ऊपर वर्णित अनुसार, एक प्रतिनिधि आईओएस या उद्देश्य-सी की विशेषता नहीं है, लेकिन केवल एक प्रोग्रामिंग तकनीक है और इसके लिए कोई विशिष्ट भाषा समर्थन की आवश्यकता नहीं है।

एक वर्ग (उदा, ClassA) लिखा जा सकता है इस तरह के अपने GetData और DoSomething तरीकों से ही नहीं लागू किया जा सकता है, लेकिन एक प्रतिनिधि द्वारा (शायद क्योंकि ClassA पता नहीं है कि कौन सा डेटा होगा हो या क्या करना होगा)।और फिर, जब यह उन तरीकों कॉल करने के लिए चाहता है, यह

इस लक्ष्य को हासिल करने के लिए, ClassA एक संपत्ति है, आमतौर पर प्रतिनिधि कहा जाता है, (- - प्रतिनिधि कि प्रत्यायोजित तरीकों को लागू करता है जो सिर्फ वर्ग के लिए एक सूचक है) प्रदान करता है वास्तव में प्रतिनिधि में तरीकों कॉल:

[self.delegate getData]; 

और

[self.delegate doSomething]; 

self.delegate शुरू में self लिए सेट किया जा सकता है:

self.delegate = self; 

i.e. classA इन तरीकों का अपना संस्करण लागू करता है, जब तक कि उन्हें प्रतिनिधि नहीं दिया जाता है।

किसी भी अन्य वर्ग, विधियों के कार्यान्वयनकर्ता बनना चाहते हैं (यानी प्रतिनिधि बनने के लिए और संभवतः कक्षा ए के डिफ़ॉल्ट कार्यान्वयन को ओवरराइड करना), पहले क्लासए के प्रतिनिधि को स्वयं ही सेट कर देगा। इसलिए यदि classB इन तरीकों के लिए प्रतिनिधि बनना चाहता था, classB में, हम होगा:

classA.delegate = self; 

तो जब ClassA इन सौंप तरीकों कहता है, यह वास्तव में classB कॉल कर रहा है इन तरीकों को लागू करने के classB या यहाँ तक कि के बारे में कुछ भी जानने के बिना, यह अस्तित्व में है और क्लासबी को उप-श्रेणी कक्षा ए नहीं है। उपवर्गीकरण साथ, आप किसी भी विधि ओवरराइड कर सकते हैं -

सीमा यह है कि classB केवल तरीकों जो ClassA को सौंपने के लिए चाहता है ओवरराइड कर सकते हैं।

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

+0

मेरा बुरा - एक पुराने धागे को पुनर्जीवित किया। –

+2

यह वास्तव में एक अद्भुत व्याख्या है। मुझे अब तक 'classA.delegate = self' भाग को समझने में परेशानी थी। धन्यवाद। – daspianist

+1

आपका स्वागत है। मैं भी उलझन में था और सिर्फ उस कोड को लिखूंगा जिसने इसे बिना समझ के काम किया। फिर अचानक किसी ने इसे इस तरह से समझाया कि यह क्लिक करता है, आप वास्तव में समझते हैं कि यह कैसे काम करता है और यह अचानक सरल लगता है। –

3

मैं साधारण प्रोग्राम के माध्यम से यह विस्तृत करने के

दो वर्गों

Student.h

#import <Foundation/Foundation.h> 

@interface Student : NSObject 
@property (weak) id delegate; 
- (void) studentInfo; 
@end 

Student.m

#import "Student.h" 
@implementation Student 
- (void) studentInfo 
{ 
    NSString *teacherName; 
    if ([self.delegate respondsToSelector:@selector(teacherName)]) { 
     teacherName = [self.delegate performSelector:@selector(teacherName)]; 
    } 
    NSLog(@"\n Student name is XYZ\n Teacher name is %@",teacherName); 
} 
@end 

Teacher.h

कोशिश

Teacher.m

#import "Teacher.h" 

@implementation Teacher 

- (NSString *) teacherName 
{ 
    return @"ABC"; 
} 
- (id) initWithStudent:(Student *)student 
{ 
    self = [ super init]; 
    if (self) { 
     self.student = student; 
     self.student.delegate = self; 
    } 
    return self; 
} 
@end 

main.m

#import <Foundation/Foundation.h> 
#import "Teacher.h" 
int main (int argc, const char* argv[]) 
{ 
    @autoreleasepool { 

     Student *student = [[Student alloc] init]; 
     Teacher *teacher = [[Teacher alloc] initWithStudent:student]; 

     [student studentInfo]; 

    } 
    return 0; 
} 

व्याख्या :::

  1. मुख्य विधि से जब initWithStudent: छात्र निष्पादित करेंगे

    1,1 शिक्षक वस्तु की संपत्ति 'छात्र' एक होगा छात्र वस्तु के साथ ssigned।

    1.2 self.student.delegate = आत्म का मतलब छात्र वस्तु के प्रतिनिधि मुख्य विधि से शिक्षक वस्तु

  2. की ओर इशारा करता होगा जब [छात्र studentInfo]

    2.1 [self.delegate respondToSelector बुलाया जाएगा: @ चयनकर्ता (teacherName)] यहां प्रतिनिधि पहले से ही शिक्षक वस्तु को अंक तो यह 'teacherName' उदाहरण विधि आह्वान कर सकते हैं।

    2.2 इसलिए [self.delegate प्रदर्शन चयनकर्ता: @ चयनकर्ता (शिक्षक नाम)] आसानी से निष्पादित करेगा।

ऐसा लगता है कि शिक्षक ऑब्जेक्ट छात्र ऑब्जेक्ट को अपनी खुद की विधि कहने के लिए प्रतिनिधि निर्दिष्ट करता है।

यह एक रिश्तेदार विचार, जहाँ हम है कि छात्र 'teacherName' विधि कहा जाता वस्तु को देखने के है, लेकिन यह मूल रूप से शिक्षक वस्तु अपने आप में किया जाता है।

+0

छात्र.एम और शिक्षक एच समान हैं। कोई भी मौका आप सही कोड डाल सकते हैं? मैं एक कस्टम प्रतिनिधि वर्ग का उपयोग करने के तरीके को हल करने की कोशिश कर रहा हूं और मुझे कोई सहायक उदाहरण नहीं मिल रहा है। अब तक मैंने देखा है कि आपका सबसे अच्छा है। – CamHart

+0

@CamHart मेरी गलती को सूचित करने के लिए धन्यवाद। यदि आप "प्रतिनिधि" के संबंध में किसी और समस्या का सामना करते हैं तो कृपया वहां टिप्पणी करें। –

0

जरा कल्पना है कि आप को फोन पर कहते हैं, और एक पिज़्ज़ा ऑर्डर। फिर, एक पिज्जा डिलीवरी लड़का अपने घर के लिए आता है (यह एक प्रतिनिधि है), और जब आप पिज्जा के लिए भुगतान करते हैं, प्रसव पिज्जा लड़का अपने रेस्तरां के लिए पैसे देता है।

आप = वस्तु वितरण लड़का = प्रतिनिधि रेस्टोरेंट = वस्तु

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