關(guān)于Copy

關(guān)于Copy


指針復(fù)制

- (void)viewDidLoad {
    [super viewDidLoad];

    /*
     指針復(fù)制,p1和p2的地址相同
     */
    RAPPerson *p1 = [RAPPerson new];
    RAPPerson *p2 = p1;
    NSLog(@"p1: %p---p2: %p", p1, p2);
}

對象復(fù)制

The exact meaning of “copy” can vary from class to class, but a copy must be a functionally independent object with values identical to the original at the time the copy was made.

  • 待復(fù)制的類必須遵守NSCopying協(xié)議,具體的復(fù)制細節(jié)取決于其對于copyWithZone:方法的實現(xiàn)。
  • 根據(jù)文檔描述,復(fù)制出的對象,其值和原始對象相同,但功能上完全獨立的對象。
  • 對于某些類,例如NSString,NSArray,copy并不總是意味著創(chuàng)建新的對象。系統(tǒng)會出于優(yōu)化內(nèi)存的目的,結(jié)合實際情況判斷是否應(yīng)該創(chuàng)建新的對象,或返回原本的對象。(具體出自哪個資料我忘記了,待查)
- (void)viewDidLoad {
    [super viewDidLoad];

    /*
     對象復(fù)制,p1和p2地址不同
     */
    RAPPerson *p1 = [RAPPerson new];
    p1.age = 100;
    RAPPerson *p2 = [p1 copy];
    NSLog(@"%d", p2.age);
    NSLog(@"p1: %p---p2: %p", p1, p2);
}

// 下面是RAPPerson類對于NSCopying協(xié)議的實現(xiàn),及其定義的屬性
@interface RAPPerson : NSObject <NSCopying>
/** 年齡 */
@property (nonatomic, assign) int age;

/** 朋友 */
@property (nonatomic, strong) NSArray *friends;
@end

@implementation RAPPerson
- (id)copyWithZone:(NSZone *)zone {
    RAPPerson *copy = [[RAPPerson allocWithZone:zone] init];
    copy.age = _age;
    copy.friends = _friends
    return copy;
}
@end


深層復(fù)制

  • 根據(jù)Effective Objective-C 2.0書中Item 22的描述,對象復(fù)制其實是淺層復(fù)制,即只復(fù)制了對象,但對象所攜帶的數(shù)據(jù),即屬性,沒有得到復(fù)制。
  • 深層復(fù)制意味著不僅復(fù)制對象,而且復(fù)制對象的屬性所指向的對象。
  • 不管是NSCopying還是NSMutableCopying協(xié)議,都屬于淺復(fù)制;想要實現(xiàn)深層復(fù)制,必須手動重寫copyWithZone:方法。
@implementation RAPPerson
- (id)copyWithZone:(NSZone *)zone {
    RAPPerson *copy = [[RAPPerson allocWithZone:zone] init];
    copy.age = _age;
    // 不僅復(fù)制對象,還復(fù)制friends這個數(shù)組中所包含的所有對象
    copy.friends = [[NSArray alloc] initWithArray:_friends copyItems:YES];
    return copy;
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容