2009-04-18 13 views
9

यह कोड बहुत आसान है, क्या यह सही है? मुझे नहीं पता कि मुझे इनिट विधि के माध्यम से पारित प्रतिनिधि को बनाए रखना चाहिए या नहीं।प्रतिनिधियों के बारे में प्रश्न

@interface SomeClass : NSObject { 
    SomeClassDelegate *someClassDelegate; 
} 
-(id)initWithDelegate:(SomeClassDelegate *)delegate; 
@end 

@implementation SomeClass 
-(id)initWithDelegate:(SomeClassDelegate *)delegate 
{ 
    [delegate retain]; // should I be doing this? 
    someClassDelegate = delegate; 
} 
-(void)dealloc 
{ 
    [delegate release]; // obviously only do this if I DO need to retain it 
    [super dealloc]; 
} 
@end 

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

// self's retain count is 1 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
// the retain count is now 2, did the init of URLConnection retain self? 
+1

NSURLConnection एक विशेष मामला है। यह इतना नहीं है कि यह प्रतिनिधि को बरकरार रखे, लेकिन यह कनेक्शन_ की अवधि के लिए इसे बनाए रखता है क्योंकि प्रतिनिधि संदेश प्राप्त करने का एकमात्र तरीका कनेक्शन रद्द करना है। यानी आम तौर पर कोई प्रतिनिधि नहीं रखता है, और NSRLConnection का व्यवहार इस तरह का कार्यान्वयन विवरण है; ऐसा कुछ नहीं जिसे आपको भरोसा करना चाहिए या आम तौर पर अनुकरण करना चाहिए। इसके अलावा, एक प्रतिनिधि _class_ होना असामान्य है। आम तौर पर आप एक प्रतिनिधि प्रोटोकॉल घोषित करते हैं। –

+0

धन्यवाद माइक, जो बताता है कि मैं क्या देख रहा हूं। – Jab

उत्तर

11

नहीं, आम तौर पर, आपको प्रतिनिधि को बनाए रखना नहीं है। चूंकि प्रतिनिधि के पास पहले से ही आपके ऑब्जेक्ट का संदर्भ है, यदि आप प्रतिनिधि को बनाए रखते हैं, तो आप अनिवार्य रूप से एक परिपत्र संदर्भ बनाएंगे। साथ ही, इसी कारण से, आप यह मान सकते हैं कि प्रतिनिधि नष्ट होने से पहले आपका ऑब्जेक्ट नष्ट हो जाएगा।

प्रतिनिधियों का उपयोग/कार्यान्वयन के बारे में अधिक जानकारी के लिए thesearticles देखें।

संपादित करें: कुछ अपवाद हैं, जिन्हें दूसरों द्वारा इंगित किया गया है।

+0

लेखों के लिए धन्यवाद, आपने प्रतिनिधियों पर अपनी धारणा की पुष्टि की। माइक ने मुझे समझाया कि मैं अपने प्रश्न की टिप्पणियों में NSRLConnection के साथ जो देखता हूं उसे देखता हूं। – Jab

+2

स्थिति के आधार पर, आपकी वस्तु पहले नष्ट नहीं हो सकती है, लेकिन कम से कम प्रतिनिधि प्रतिनिधि को अनसेट कर देगा। (उदाहरण: यूआईएक्सेलेरोमीटर) – rpetrich

1

जैसा कि एचटीवी कहते हैं, आपको आम तौर पर प्रतिनिधि को बनाए रखना नहीं चाहिए। एक बहु थ्रेडेड वातावरण में, आपको यह सुनिश्चित करने के लिए कि आपको अपनी पीठ के पीछे अमान्य नहीं किया गया है, भले ही आपको केवल एक विधि कॉल की अवधि के लिए आवश्यक सब कुछ बरकरार रखना पड़े। यदि, उदाहरण के लिए (वास्तव में मामला नहीं), -[NSURLConnection initWithRequest:delegate] ने एक नया धागा बनाया है जो धागे को बनाए रख सकता है (तब संभवतः ऑटोरेलीज होगा) इसके पैरामीटर। हकीकत में, NSURLConnection एक विशेष मामला है जिसमें यह कनेक्शन की अवधि के लिए अपने प्रतिनिधि को बरकरार रखता है।

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