2010-01-06 24 views
9

क्या कॉपीविथज़ोन (नीचे देखें) सही है, विशेष रूप से बिट जहां मैं सेटर्स का उपयोग नई ऑब्जेक्ट के इंस्टेंस चर को पॉप्युलेट करने के लिए करता हूं?copyWithZone सेटिंग आवृत्ति चर?

@interface Planet : NSObject <NSCopying> 
{ 
    NSString *name; 
    NSString *type; 
    NSNumber *mass; 
    int index; 
} 
@property(copy) NSString *name; 
@property(copy) NSString *type; 
@property(retain) NSNumber *mass; 
@property(assign) int index; 
-(void)display; 
@end 

-(id) copyWithZone: (NSZone *) zone { 
    Planet *newPlanet = [[Planet allocWithZone:zone] init]; 
    NSLog(@"_copy: %@", [newPlanet self]); 
    [newPlanet setName:name]; 
    [newPlanet setType:type]; 
    [newPlanet setMass:mass]; 
    [newPlanet setIndex:index]; 
    return(newPlanet); 
} 

EDIT_001:

यह एक बेहतर तरीका है?

-(id) copyWithZone: (NSZone *) zone { 
    Planet *newPlanet = [[[self class] allocWithZone:zone] init]; 
    [newPlanet setName:[self name]]; 
    [newPlanet setType:[self type]]; 
    [newPlanet setMass:[self mass]]; 
    [newPlanet setIndex:[self index]]; 
    return(newPlanet); 
} 

बहुत धन्यवाद

गैरी

+0

वे दोनों काम करते हैं, लेकिन दूसरे तरीके से अनावश्यक विधि आमंत्रण है। – NSResponder

+0

@NSResponder: मुझे लगता है कि अगर आप वापसी से पहले लिखते हैं (newPlanet); कुछ [self setMass: a_new_number] की तरह, आप newPlanet.mass मान को बदल देंगे, क्योंकि इसे बनाए रखा गया है। यही है ना ? – Oliver

उत्तर

3

यह एक अवांछित प्रतिलिपि या न हो तो आपके तय करने के लिए है या नहीं। कॉपी क्वालीफायर के साथ एक्सेसर्स को संश्लेषित करने का कारण उन वस्तुओं के स्वामित्व के बारे में सुनिश्चित करना है।

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

+0

सच है, क्या यह विधि आवृत्ति चर सेट करने का सही तरीका है या क्या मुझे बेहतर तरीका याद आ रहा है? – fuzzygoat

3

क्या आपने this guide पढ़ा है? यदि ऐसा है, तो आपको यह चुनना होगा कि क्या आप उथले या गहरी प्रतिलिपि चाहते हैं। उथले प्रतियों के लिए, आप मूल्य साझा कर सकते हैं: NSCell sublcass को लागू करते समय यह एक सामान्य दृष्टिकोण है जो NSImage उदाहरण साझा करता है।

जैसा कि मुझे संदर्भ पता नहीं है, मैं कहूंगा कि आपका कार्यान्वयन सही लगता है।

+0

तो ऊपर दिए गए उदाहरण में यह एक गहरी कॉपी होगी क्योंकि सेटर एक प्रतिलिपि बनाता है, हालांकि मैं इस बात की सराहना करता हूं कि एनएसएस पर एक एनएसएसटींग की प्रतिलिपि बनाने की गिनती है? – fuzzygoat

6

(गहरी प्रति मानना ​​जो आप चाहते हैं) उस प्रतिलिपि के लिए जिसे हम बनाना चाहते हैं, कॉपीविथज़ोन का उपयोग करें: ऑब्जेक्ट इंस्टेंस चर के लिए और बस = का उपयोग करके आदिम आवृत्ति चर सेट करें।

- (id)copyWithZone:(NSZone *)zone 
{ 
    MyClass *copy = [[MyClass alloc] init]; 

    // deep copying object properties 
    copy.objectPropertyOne = [[self.objectPropertyOne copyWithZone:zone] autorelease]; 
    copy.objectPropertyTwo = [[self.objectPropertyTwo copyWithZone:zone] autorelease]; 
        ... 
    copy.objectPropertyLast = [[self.objectPropertyLast copyWithZone:zone] autorelease]; 

    // deep copying primitive properties 
    copy.primitivePropertyOne = self.primitivePropertyOne 
    copy.primitivePropertyTwo = self.primitivePropertyTwo 
        ... 
    copy.primitivePropertyLast = self.primitivePropertyLast 

    // deep copying object properties that are of type MyClass 
    copy.myClassPropertyOne = self.myClassPropertyOne 
    copy.myClassPropertyTwo = self.myClassPropertyTwo 
        ... 
    copy.myClassPropertyLast = self.myClassPropertyLast 


    return copy; 
} 

लेकिन ध्यान दें कि स्वयं और प्रतिलिपि के समान वर्ग के गुणों को प्रतिलिपि के बिना सेट किया जाना चाहिए WithZone:। अन्यथा, ये ऑब्जेक्ट्स इस प्रतिलिपि को फिर से कॉल करेंगे, और कॉपीविथज़ोन का उपयोग करके अपने myClassProperties को सेट करने का प्रयास करेंगे। यह एक अवांछित अनंत लूप ट्रिगर करता है। (इसके अलावा, आप allocWithZone को कॉल कर सकते हैं: आवंटन के बजाय: लेकिन मुझे पूरा यकीन है कि आवंटित: allocWithZone को कॉल करें: वैसे भी)

कुछ ऐसे मामले हैं जहां एक ही कक्षा के गहरे प्रति ऑब्जेक्ट गुणों का उपयोग करना = आप करना चाहते हैं, लेकिन सभी मामलों में (जहां तक ​​मुझे पता है) कॉपीविथज़ोन के साथ एक ही कक्षा के गहरे रंग के ऑब्जेक्ट गुण: या कॉपी करने वाले किसी भी चीज़ विथज़ोन: परिणामस्वरूप अनंत लूप होगा।

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