第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

實施NSCopying

實施NSCopying

胡子哥哥 2019-12-26 09:10:13
我已經閱讀了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從字典初始化。我將添加其中一種方法,它們可能相關,也可能不相關。-(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]; 因此,總結一下這個可怕的問題。我需要復制Vendor對象數組。我相信我需要在上實現NSCopying協(xié)議Vendor,這可能意味著我也需要在協(xié)議上實現,Car因為它Vendor包含Cars 數組。這意味著我還需要在屬于該Car對象的2個數組中持有的類上實現它。如果我能在上實現NSCopying協(xié)議方面獲得一些指導,我真的很感激Vendor,我在任何地方都找不到關于此的任何教程。
查看完整描述

3 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

要實現NSCopying,您的對象必須響應-copyWithZone:選擇器。聲明符合條件的方式如下:


@interface MyObject : NSObject <NSCopying> {

然后,在對象的實現中(您的.m文件):


- (id)copyWithZone:(NSZone *)zone

{

    // Copying code here.

}

您的代碼應該做什么?首先,創(chuàng)建該對象的新實例-您可以調用[[[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;

}


查看完整回答
反對 回復 2019-12-26
?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

該答案與已接受的答案相似,但是使用allocWithZone:并針對ARC更新了該答案。NSZone是分配內存的基礎類。盡管NSZone在大多數情況下忽略可能有效,但這仍然是不正確的。


為了正確實現,NSCopying您必須實現一種協(xié)議方法,該方法分配具有與原始值匹配的屬性的對象的新副本。


在標題的接口聲明中,指定您的類實現了該NSCopying協(xié)議:


@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;

}


查看完整回答
反對 回復 2019-12-26
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

只需調用object.copy()即可創(chuàng)建副本。


我沒有使用copy()過值類型,因為它們是“自動”復制的。但是,我不得不使用copy()的class類型。


我忽略了該NSZone參數,因為文檔稱它已棄用:


該參數被忽略。存儲區(qū)不再由Objective-C使用。


另外,請注意,這是一個簡化的實現。如果您有子類,它會變得有些棘手,您應該使用動態(tài)類型: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

    }

}


查看完整回答
反對 回復 2019-12-26
  • 3 回答
  • 0 關注
  • 740 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號