programing

NSCopy 구현

instargram 2023. 10. 19. 21:53
반응형

NSCopy 구현

읽어봤습니다.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

Vendorclass에는 다음과 같은 객체의 배열이 있습니다.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그것은 사전에서 나온 것입니다.이 방법 중 하나를 추가하겠습니다. 이 방법들은 관련이 있을 수도 있습니다.

-(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배열을 보유하고 있습니다.Cars. 즉, 해당 시스템에 속한 2개의 어레이에서 진행되는 클래스에서도 구현해야 합니다.Car물건.

구현에 대한 지침을 얻을 수 있다면 정말 감사하겠습니다.NSCopying의전.Vendor, 어디에서도 이것에 대한 튜토리얼을 찾을 수 없습니다.

NSCopying을 구현하려면 개체가 다음에 응답해야 합니다.-copyWithZone:선택자이를 준수한다고 선언하는 방법은 다음과 같습니다.

@interface MyObject : NSObject <NSCopying> {

그 다음, 당신의 객체의 구현(당신의.m파일):

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

코드가 어떻게 해야 합니까?먼저 개체의 새 인스턴스를 만듭니다. 호출할 수 있습니다.[[[self class] alloc] init]서브클래스에 적합한 현재 클래스의 초기화된 객체를 얻는 것.다음의 하위 클래스인 모든 인스턴스 변수의 경우NSObject복사를 지원하는 전화를 걸 수 있습니다.[thatObject copyWithZone:zone]새로운 목적을 위해.원시 유형의 경우(int,char,BOOL그리고 친구)는 변수를 같게 설정합니다.Vendor의 경우 다음과 같습니다.

- (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;
}

이 답변은 수락된 것과 비슷하지만 사용합니다.allocWithZone:ARC용으로 업데이트됩니다.NSZone은 메모리 할당을 위한 기초 클래스입니다.무시하면서NSZone대부분의 경우에 효과가 있을 수 있지만 여전히 정확하지 않습니다.

올바르게 구현하기 위해서는NSCopying원본의 값과 일치하는 속성을 사용하여 개체의 새 복사본을 할당하는 프로토콜 방법을 구현해야 합니다.

헤더의 인터페이스 선언에서 클래스가 다음을 구현하도록 지정합니다.NSCopying프로토콜:

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

.m 구현에서 a를 추가합니다.-(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;
}

스위프트 버전

그냥 전화하세요.object.copy()복사본을 만들기 위해서 입니다.

안 썼어요.copy()값 유형의 경우 "자동으로" 복사됩니다.하지만 저는 사용해야만 했습니다.copy()위해서class종류들.

나는 무시했습니다.NSZoneparameter(parameter)는 문서에서 더 이상 사용되지 않는다고 말합니다.

이 매개 변수는 무시됩니다.Objective-C는 메모리 영역을 더 이상 사용하지 않습니다.

또한, 이는 단순화된 구현이라는 점에 유의하시기 바랍니다.하위 클래스가 있는 경우 약간 더 까다로워지므로 동적 유형을 사용해야 합니다.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
    }
}

언급URL : https://stackoverflow.com/questions/4089238/implementing-nscopying

반응형