এনএসকোয়িং বাস্তবায়ন করা হচ্ছে


84

আমি NSCopyingদস্তাবেজগুলি পড়েছি তবে কী কী প্রয়োজন তা কীভাবে প্রয়োগ করতে হয় সে সম্পর্কে এখনও আমি খুব নিশ্চিত।

আমার ক্লাস Vendor:

@interface Vendor : NSObject 
{
    NSString        *vendorID;
    NSMutableArray  *availableCars;
    BOOL            atAirport;
}

@property (nonatomic, copy) NSString *vendorID;
@property (nonatomic, retain) NSMutableArray *availableCars;
@property (nonatomic, assign) BOOL atAirport;

- (id)initFromVehVendorAvailsDictionary:(NSDictionary *)vehVendorAvails;

@end

Vendorবর্গ বস্তু নামক একটি অ্যারে আছে Car

আমার Carউদ্দেশ্য:

@interface Car : NSObject 
{
    BOOL            isAvailable;
    NSString        *transmissionType;
    NSMutableArray  *vehicleCharges; 
    NSMutableArray  *fees; 
}

@property (nonatomic, assign) BOOL isAvailable;
@property (nonatomic, copy) NSString *transmissionType;
@property (nonatomic, retain) NSMutableArray *vehicleCharges;
@property (nonatomic, retain) NSMutableArray *fees;

- (id) initFromVehicleDictionary:(NSDictionary *)vehicleDictionary;

@end

সুতরাং, অবজেক্টের Vendorএকটি অ্যারে ধরেছে CarCarঅন্যান্য কাস্টম অবজেক্টের 2 অ্যারে ধারণ করে।

Vendorএবং উভয়ই Carঅভিধান থেকে দীক্ষিত। আমি এই পদ্ধতির একটি যুক্ত করব, সেগুলি প্রাসঙ্গিক হতে পারে বা নাও পারে।

-(id)initFromVehVendorAvailsDictionary:(NSDictionary *)vehVendorAvails {

    self.vendorCode      = [[vehVendorAvails objectForKey:@"Vendor"] 
                           objectForKey:@"@Code"];

    self.vendorName      = [[vehVendorAvails objectForKey:@"Vendor"] 
                           objectForKey:@"@CompanyShortName"];

    self.vendorDivision  = [[vehVendorAvails objectForKey:@"Vendor"]   
                           objectForKey:@"@Division"];

    self.locationCode    = [[[vehVendorAvails objectForKey:@"Info"] 
                           objectForKey:@"LocationDetails"] 
                           objectForKey:@"@Code"];

    self.atAirport       = [[[[vehVendorAvails objectForKey:@"Info"] 
                           objectForKey:@"LocationDetails"] 
                           objectForKey:@"@AtAirport"] boolValue];

    self.venLocationName = [[[vehVendorAvails objectForKey:@"Info"] 
                           objectForKey:@"LocationDetails"] 
                           objectForKey:@"@Name"];

    self.venAddress      = [[[[vehVendorAvails objectForKey:@"Info"] 
                           objectForKey:@"LocationDetails"] 
                           objectForKey:@"Address"] 
                           objectForKey:@"AddressLine"];

    self.venCountryCode  = [[[[[vehVendorAvails objectForKey:@"Info"]  
                           objectForKey:@"LocationDetails"] 
                           objectForKey:@"Address"] 
                           objectForKey:@"CountryName"]
                           objectForKey:@"@Code"];

    self.venPhone        = [[[[vehVendorAvails objectForKey:@"Info"]  
                           objectForKey:@"LocationDetails"]        
                           objectForKey:@"Telephone"] 
                           objectForKey:@"@PhoneNumber"];

    availableCars        = [[NSMutableArray alloc] init];

    NSMutableArray *cars = (NSMutableArray *)[vehVendorAvails objectForKey:@"VehAvails"];

    for (int i = 0; i < [cars count]; i++) {

        Car *car = [[Car alloc] initFromVehicleDictionary:[cars objectAtIndex:i]];
        [availableCars addObject:car];
        [car release];
    }

    self.venLogo = [[[vehVendorAvails objectForKey:@"Info"] 
                   objectForKey:@"TPA_Extensions"] 
                   objectForKey:@"VendorPictureURL"];

    return self;
}

তাই ভীতিজনক সমস্যার সংক্ষিপ্তসার হিসাবে।

আমার একটি অ্যারে Vendorঅবজেক্টের কপি করা দরকার । আমি বিশ্বাস করি যে আমার NSCopyingপ্রোটোকলটি চালু করা দরকার Vendor, যার অর্থ আমি এটি কার্যকর করতে হবে Carযেহেতু এস এর Vendorঅ্যারে রয়েছে Car। তার মানে আমার এটি ক্লাসগুলিতেও প্রয়োগ করা উচিত যা Carঅবজেক্টের অন্তর্ভুক্ত 2 অ্যারেতে অনুষ্ঠিত হয় ।

আমি NSCopyingপ্রোটোকল বাস্তবায়নের বিষয়ে কিছু গাইডেন্স পেতে পারলে আমি সত্যিই এটির প্রশংসা করব Vendor, আমি এর কোথাও কোনও টিউটোরিয়াল খুঁজে পাচ্ছি না।


আপনি এনএসকোপিটিংয়ের ডকুমেন্টেশন পড়েছেন? প্রয়োজনের সময় আমি এটি বেশ পরিষ্কার পেয়েছি।
jv42

4
হ্যাঁ, পড়ুন এবং এটি পুনরায় পড়ুন। আমি খুব কমই অ্যাপল ডক্স থেকে শিখতে সহজ পাই যদিও প্রোগ্রামিংয়ের সময় এগুলি পদ্ধতিগুলি আবিষ্কার করার জন্য দুর্দান্ত। ধন্যবাদ-কোড

উত্তর:


186

এনএসকোপিং বাস্তবায়নের জন্য আপনার বিষয়টিকে অবশ্যই -copyWithZone:নির্বাচককে প্রতিক্রিয়া জানাতে হবে । আপনি কীভাবে ঘোষণা করেন যে আপনি এটি মেনে চলছেন:

@interface MyObject : NSObject <NSCopying> {

তারপরে, আপনার অবজেক্টের প্রয়োগে (আপনার .mফাইল):

- (id)copyWithZone:(NSZone *)zone
{
    // Copying code here.
}

আপনার কোড কি করা উচিত? প্রথমত, অবজেক্টটির একটি নতুন উদাহরণ তৈরি করুন the আপনি [[[self class] alloc] init]বর্তমান শ্রেণীর একটি প্রাথমিক আজ্ঞা পেতে কল করতে পারেন , যা সাবক্লাসিংয়ের জন্য ভাল কাজ করে। তারপরে, যে কোনও উদাহরণের ভেরিয়েবলগুলি যা NSObjectঅনুলিপি সমর্থন করে তার একটি সাবক্লাস , আপনি [thatObject copyWithZone:zone]নতুন বস্তুর জন্য কল করতে পারেন । আদিম ধরনের জন্য ( int, char, BOOLএবং বন্ধুদের) শুধু ভেরিয়েবল সমান হতে সেট। সুতরাং, আপনার মান্যতা বিক্রেতার জন্য এটি দেখতে এমন দেখাচ্ছে:

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

    if (copy) {
        // Copy NSObject subclasses
        [copy setVendorID:[[self.vendorID copyWithZone:zone] autorelease]];
        [copy setAvailableCars:[[self.availableCars copyWithZone:zone] autorelease]];

        // Set primitives
        [copy setAtAirport:self.atAirport];
    }

    return copy;
}

4
@ কোড: copyজেফের মতো একটি অগভীর অনুলিপি হিসাবে সাধারণত প্রয়োগ করা হয়। এটি অস্বাভাবিক - যদিও অকল্পনীয় নয় - আপনি একটি সম্পূর্ণ অনুলিপি অনুলিপি চান (যেখানে সমস্ত দিক দিয়ে সমস্ত কিছু অনুলিপি করা হয়)। গভীর অনুলিপিগুলিও অনেক বেশি সমস্যা, তাই আপনি সাধারণত নিশ্চিত হন যে আপনি যা চান তা নিশ্চিত।
চক

4
আপনার copyWithZone:কোডটিতে একটি সমস্যা আছে যেখানে আপনি আপনার সাবক্লাসগুলি অনুলিপি করেছেন, কারণ 1 এর রেফারেন্স গণনা সহ কোনও অবজেক্ট রিটার্ন করে এবং কোনও অটোরিলেজ এটি ফাঁস হওয়ার কারণ হবে না। আপনাকে কমপক্ষে একটি অটোরিলেজ যুক্ত করতে হবে।
মারিয়াস

22
পরিবর্তে [[self class] alloc]ব্যবহার allocWithZoneকরা উচিত নয় ? এটি আনার জন্য দুঃখিত।
jweyrich

4
ভাবেন, আমি মনে করি এআরসি ব্যবহার করে (যেহেতু কোনও অ্যাপ্লিকেশনের জন্য ন্যূনতম সমর্থিত আইওএস হ'ল ৪.৩), আপনাকে মুক্তি এবং অটো-রিলিজ সম্পর্কে চিন্তা করার দরকার নেই।
রিশাভ

4
@ জেনারাল মাইক: এটি সম্ভবত একটি পৃথক প্রশ্ন হওয়া উচিত তবে সাধারণভাবে (আমি সেখানে কী করেছি দেখুন?) আপনি গভীর কপির সময় প্রতিটি বস্তুটি মূল থেকে অনুলিপি করতে নিশ্চিত করতে চান — এবং নিশ্চিত করুন যে তাদের -copyপদ্ধতিগুলিও গভীর অনুলিপিগুলি করে ।
জেফ কেলি

6

এই উত্তর স্বীকৃত অনুরূপ, কিন্তু ব্যবহার করে allocWithZone:এবং এটিআরসি জন্য আপডেট করা হয়। NSZone মেমরি বরাদ্দ করার জন্য ভিত্তি শ্রেণি। উপেক্ষা করা NSZoneবেশিরভাগ ক্ষেত্রে কার্যকর হতে পারে তবে এটি এখনও ভুল।

সঠিকভাবে প্রয়োগ করার জন্য NSCopyingআপনাকে অবশ্যই একটি প্রোটোকল পদ্ধতি প্রয়োগ করতে হবে যা মূলটির মানগুলির সাথে মেলে এমন বৈশিষ্ট্য সহ অবজেক্টের একটি নতুন অনুলিপি বরাদ্দ করে।

শিরোনামে ইন্টারফেস ঘোষণায়, নির্দিষ্ট করুন যে আপনার শ্রেণি NSCopyingপ্রোটোকলটি প্রয়োগ করে :

@interface Car : NSObject<NSCopying>
{
 ...
}

.M বাস্তবায়নে -(id)copyWithZoneএমন একটি পদ্ধতি যুক্ত করুন যা নিম্নলিখিতগুলির মতো কিছু দেখায়:

- (id)copyWithZone:(NSZone*)zone
{
    Car* carCopy = [[[self class] allocWithZone:zone] init];

    if (carCopy)
    {
        carCopy.isAvailable = _isAvailable;
        carCopy.transmissionType = _transmissionType;
        ... // assign all other properties.
    }

    return carCopy;
}

2

সুইফট সংস্করণ

object.copy()অনুলিপি তৈরি করার জন্য কেবল কল করুন ।

copy()এগুলি "স্বয়ংক্রিয়ভাবে" অনুলিপি করা হওয়ায় আমি মান ধরণের জন্য ব্যবহার করি নি । তবে আমাকে ধরণের copy()জন্য ব্যবহার করতে হয়েছিল class

আমি NSZoneপ্যারামিটারটিকে উপেক্ষা করেছি কারণ ডক্স বলছে এটি অবহেলা করা হয়েছে:

এই পরামিতি উপেক্ষা করা হয়। মেমরি অঞ্চলগুলি এখন আর অবজেক্টিভ-সি ব্যবহার করে না।

এছাড়াও, দয়া করে নোট করুন যে এটি একটি সরলীকৃত বাস্তবায়ন। আপনি উপশ্রেণী থেকে থাকে একটু tricker পায় এবং আপনি গতিশীল টাইপ ব্যবহার করা উচিত: type(of: self).init(transmissionType: transmissionType)

class Vendor {
    let vendorId: String
    var availableCars: [Car] = []

    init(vendorId: String) {
        self.vendorId = vendorId
    }
}

extension Vendor: NSCopying {
    func copy(with zone: NSZone? = nil) -> Any {
        let copy = Vendor(vendorId: vendorId)
        if let availableCarsCopy = availableCars.map({$0.copy()}) as? [Car] {
            copy.availableCars = availableCarsCopy
        }
        return copy
    }
}

class Car {
    let transmissionType: String
    var isAvailable: Bool = false
    var fees: [Double] = []

    init(transmissionType: String) {
        self.transmissionType = transmissionType
    }
}

extension Car: NSCopying {
    func copy(with zone: NSZone? = nil) -> Any {
        let copy = Car(transmissionType: transmissionType)
        copy.isAvailable = isAvailable
        copy.fees = fees
        return copy
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.