আমাকে একটি কাস্টম অবজেক্টের গভীর অনুলিপি করতে হবে যার নিজস্ব জিনিস রয়েছে। আমি আশেপাশে পড়ছি এবং এনএসকোপিং কীভাবে উত্তরাধিকারী হবে এবং এনএসকপিওজেক্ট কীভাবে ব্যবহার করতে হয় সে সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছি।
আমাকে একটি কাস্টম অবজেক্টের গভীর অনুলিপি করতে হবে যার নিজস্ব জিনিস রয়েছে। আমি আশেপাশে পড়ছি এবং এনএসকোপিং কীভাবে উত্তরাধিকারী হবে এবং এনএসকপিওজেক্ট কীভাবে ব্যবহার করতে হয় সে সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছি।
উত্তর:
রেফারেন্স প্রকারের মতো সর্বদা, "অনুলিপি" এর দুটি ধারণা রয়েছে। আমি নিশ্চিত আপনি এগুলি জানেন তবে সম্পূর্ণতার জন্য।
আপনি পরেরটি চান। এটি যদি আপনার নিজস্ব একটি জিনিস হয় তবে আপনার কেবল প্রোটোকল এনএসকোপি করা এবং বাস্তবায়ন করতে হবে - (আইডি) কপি উইথজোন: (এনএস জোন *) জোন। আপনি যা চান তা করতে নির্দ্বিধায়; যদিও ধারণাটি হ'ল আপনি নিজের একটি আসল অনুলিপি তৈরি করে তা ফিরিয়ে দিন। একটি গভীর অনুলিপি তৈরি করতে আপনি আপনার সমস্ত ক্ষেত্রে কপিরউথজোনকে কল করেছেন। একটি সহজ উদাহরণ
@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
।
অ্যাপল ডকুমেন্টেশন বলছে
কপিরথ উইথজোন: উপ-শ্রেণীর সংস্করণটি সরাসরি এনএসবজেক্ট থেকে অবতরণ না করা পর্যন্ত এর প্রয়োগকরণ সংযুক্ত করার জন্য প্রথমে ম্যাসেজটি সুপারকে প্রেরণ করা উচিত।
বিদ্যমান উত্তর যুক্ত করতে
@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;
}
এখানে যুক্তি হ'ল ফলশ্রুতিযুক্ত অনুলিপি করা বস্তুটি মূল বস্তুর অবস্থা প্রতিফলিত করে। দ্য "." অপারেটর পার্শ্ব প্রতিক্রিয়াগুলির সাথে পরিচয় করিয়ে দিতে পারে কারণ এটি একটি কলকারীদের কল করে যার পরিবর্তে যুক্তি থাকতে পারে।