2009-05-18 22 views
5

बनाए रखने के गुणों के साथ एक वर्ग के निम्नलिखित परिभाषा को देखते हुए:इस संपत्ति को 'बनाए रखने' की आवश्यकता क्यों है?

@interface FeedEntry : NSObject<NSCoding> 
{ 
    NSURL* url; 
    NSData* source; 
} 

@property (retain) NSURL* url; 
@property (retain) NSData* source; 
@end 

@implementation FeedEntry 

@synthesize url; 
@synthesize source; 

-(void)encodeWithCoder:(NSCoder*)coder 
{ 
    [coder encodeObject:url  forKey:@"url"]; 
    [coder encodeObject:source forKey:@"source"]; 
} 

क्यों initWithCoder विधि में यूआरएल संपत्ति "बनाए रखने" की जरूरत है:

-(id)initWithCoder:(NSCoder*)coder 
{ 
    url = [[coder decodeObjectForKey:@"url"] retain]; 
    source = [coder decodeObjectForKey:@"source"]; 

    NSLog(@"got url=%@\n", url); 
    return self; 
} 

विशेष रूप से, क्यों संश्लेषित नहीं है " यूआरएल प्राप्त करें "विधि वस्तु को बनाए रखें? (मैं अनुमान लगा रहा हूं कि स्रोत संपत्ति को भी बनाए रखने की आवश्यकता होगी)।

उत्तर

16

त्वरित जवाब:

जब आप सेट:

url = [[coder decodeObjectForKey:@"url"] retain]; 

आप कर रहे हैं नहीं@property का उपयोग कर। आप मैन्युअल रूप से आवृत्ति चर url का मान सेट कर रहे हैं। इसलिए, आपको मैन्युअल रूप से retain मान भी होना चाहिए।

संश्लेषित गुण का उपयोग कर चर सेट करने के लिए, आप के बजाय कहेंगे:

[self setUrl:[coder decodeObjectForKey:@"url"]]; 

या

self.url = [coder decodeObjectForKey:@"url"]; 

इन रूपों में से किसी संश्लेषित तरीकों का उपयोग होता है, और स्वचालित रूप से retain संभाल ।

विवरण:

में ऑब्जेक्टिव-सी, @property और @synthesize कीवर्ड को आप के लिए मनुष्य और सेटर तरीके बनाने के लिए:

@interface MyClass 
{ 
    id someValue; 
} 
- (id)someValue; 
- (void)setSomeValue:(id)newValue; 
@end 

@implementation MyClass 
- (id)someValue { return someValue; } 
- (void)setSomeValue:(id)newValue 
{ 
    [newValue retain]; 
    [someValue release]; 
    someValue = newValue; 
} 
@end 

:

@interface MyClass 
{ 
    id someValue; 
} 
@property (retain) id someValue; 
@end 

@implementation MyClass 
@synthesize someValue; 
@end 

के बराबर है यह "आंतरिक" सदस्य चर और के बीच एक महत्वपूर्ण अंतर बनाता है संपत्ति एक ही नाम है। यदि आप नाम के आधार पर सदस्य चर का संदर्भ देते हैं, तो आप संश्लेषित संपत्ति विधियों को छोड़ रहे हैं।

+0

दरअसल! मुझे एहसास है कि यह मुझे काफी बार काटने जा रहा है। आपके जवाब के लिए धन्यवाद। – Justicle

+0

मेरी खुशी। कुछ लोगों को पहले इस्तेमाल किया जाता है। एक बार जब आप इसे थोड़ी देर के लिए कर रहे हैं, तो यह दूसरी प्रकृति बन जाती है :) –

+4

निजी कारण चरों पर _ उपसर्ग का उपयोग करने के कारणों में से एक कारण है, यह एक उदाहरण चर का उपयोग करते समय यह बताना बहुत आसान बनाता है कुछ और बनाम। –

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