जवाबों:
हमेशा संदर्भ प्रकारों के साथ, "कॉपी" की दो धारणाएं होती हैं। मुझे यकीन है कि आप उन्हें जानते हैं, लेकिन पूर्णता के लिए।
आप बाद चाहते हैं। यदि यह आपकी खुद की वस्तुओं में से एक है, तो आपको बस NSCopying और कार्यान्वयन के लिए प्रोटोकॉल को अपनाने की आवश्यकता है - (id) copyWithZone: (NSZone *) ज़ोन। आप जो चाहें करने के लिए स्वतंत्र हैं; यद्यपि विचार यह है कि आप स्वयं की एक वास्तविक प्रति बनाते हैं और उसे वापस करते हैं। आप अपने सभी फ़ील्ड पर copyWithZone कहते हैं, एक गहरी प्रतिलिपि बनाने के लिए। एक सरल उदाहरण है
@interface YourClass : NSObject <NSCopying>
{
SomeOtherObject *obj;
}
// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
// We'll ignore the zone for now
YourClass *another = [[YourClass alloc] init];
another.obj = [obj copyWithZone: zone];
return another;
}
autorelease
यह नहीं करना चाहिए , या मैं यहां कुछ याद कर रहा हूं?
copyWithZone:
इस मापदंड को पूरा करता है, इसलिए इसे +1 की एक बरकरार गणना के साथ एक वस्तु वापस करना होगा।
alloc
बजाय उपयोग करने का कोई कारण allocWithZone:
है?
allocWithZone
।
Apple प्रलेखन कहते हैं
CopyWithZone का एक उपवर्ग संस्करण: विधि को इसके कार्यान्वयन को शामिल करने के लिए, पहले सुपर को संदेश भेजना चाहिए, जब तक कि उपवर्ग सीधे NSObject से नहीं उतरता।
मौजूदा उत्तर में जोड़ने के लिए
@interface YourClass : NSObject <NSCopying>
{
SomeOtherObject *obj;
}
// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
YourClass *another = [super copyWithZone:zone];
another.obj = [obj copyWithZone: zone];
return another;
}
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
। मुझे लगता है कि यह केवल तब आवश्यक है जब हम कुछ अन्य कस्टम वर्ग से विरासत में प्राप्त कर रहे हैंcopyWithZone
मुझे उस कोड और मेरे बीच का अंतर नहीं पता है, लेकिन मुझे उस समाधान के साथ समस्या है, इसलिए मैंने थोड़ा और पढ़ा और पाया कि हमें इसे वापस करने से पहले ऑब्जेक्ट सेट करना होगा। मेरा मतलब कुछ इस तरह है:
#import <Foundation/Foundation.h>
@interface YourObject : NSObject <NSCopying>
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *line;
@property (strong, nonatomic) NSMutableString *tags;
@property (strong, nonatomic) NSString *htmlSource;
@property (strong, nonatomic) NSMutableString *obj;
-(id) copyWithZone: (NSZone *) zone;
@end
@implementation YourObject
-(id) copyWithZone: (NSZone *) zone
{
YourObject *copy = [[YourObject allocWithZone: zone] init];
[copy setNombre: self.name];
[copy setLinea: self.line];
[copy setTags: self.tags];
[copy setHtmlSource: self.htmlSource];
return copy;
}
मैंने इस जवाब को जोड़ा क्योंकि मुझे इस मुद्दे के साथ बहुत सारी समस्याएं हैं और मुझे कोई सुराग नहीं है कि ऐसा क्यों हो रहा है। मुझे अंतर नहीं पता है, लेकिन यह मेरे लिए काम कर रहा है और शायद यह दूसरों के लिए भी उपयोगी हो सकता है:)
another.obj = [obj copyWithZone: zone];
मुझे लगता है, कि यह लाइन मेमोरी लीक का कारण बनती है, क्योंकि आप obj
संपत्ति के माध्यम से पहुंचते हैं (जो मुझे लगता है) घोषित किया गया है retain
। इसलिए, संपत्ति के हिसाब से रिटेन काउंट बढ़ाया जाएगा copyWithZone
।
मेरा मानना है कि यह होना चाहिए:
another.obj = [[obj copyWithZone: zone] autorelease];
या:
SomeOtherObject *temp = [obj copyWithZone: zone];
another.obj = temp;
[temp release];
नकल के लिए -> ऑपरेटर का उपयोग भी होता है। उदाहरण के लिए:
-(id)copyWithZone:(NSZone*)zone
{
MYClass* copy = [MYClass new];
copy->_property1 = self->_property1;
...
copy->_propertyN = self->_propertyN;
return copy;
}
यहाँ तर्क परिणामी नकल वस्तु है जो मूल वस्तु की स्थिति को दर्शाती है। ""। ऑपरेटर साइड इफेक्ट्स को पेश कर सकता है क्योंकि यह एक कॉल गेटर्स होता है जो बदले में तर्क हो सकता है।