86

ドキュメントを読みましたが、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の配列を保持しCarます。Car他のカスタム オブジェクトの 2 つの配列を保持します。

Vendorとの両方Carが辞書から初期化されます。これらのメソッドの 1 つを追加します。関連する場合と関連しない場合があります。

-(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、 にも実装する必要があることを意味する可能性があります。つまり、オブジェクトに属する 2 つの配列に保持されているクラスにも実装する必要があります。CarVendorCarCar

NSCopyingでプロトコルを実装するためのガイダンスを得ることができれば、本当に感謝してVendorいます。これに関するチュートリアルはどこにも見つかりません。

4

3 に答える 3

187

NSCopyingを実装するには、オブジェクトが-copyWithZone:セレクターに応答する必要があります。これに準拠していることを宣言する方法は次のとおりです。

@interface MyObject : NSObject <NSCopying> {

次に、オブジェクトの実装 (.mファイル) で:

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

あなたのコードは何をすべきですか?まず、オブジェクトの新しいインスタンスを作成します。呼び出し[[[self class] alloc] init]て、現在のクラスの初期化されたオブジェクトを取得できます。これは、サブクラス化に適しています。NSObject次に、コピーをサポートするのサブクラスである任意のインスタンス変数[thatObject copyWithZone:zone]に対して、新しいオブジェクトを呼び出すことができます。プリミティブ型 ( intcharBOOLおよびフレンド) の場合は、変数が等しくなるように設定するだけです。したがって、オブジェクト ベンダーの場合、次のようになります。

- (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;
}
于 2010-11-03T16:42:41.527 に答える