麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

OC語(yǔ)言-08-深拷貝與淺拷貝詳解(示例)

2019-11-14 18:20:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

概述


  • 拷貝:復(fù)制一個(gè)與源對(duì)象內(nèi)容相同的對(duì)象
  • 實(shí)現(xiàn)拷貝,需要遵守以下兩個(gè)協(xié)議

    • NSCopying
    • NSMutableCopying
  • 拷貝返回對(duì)象的種類(lèi)

    • 可變,mutableCopy消息返回的對(duì)象
    • 不可變,copy消息返回的對(duì)象
  • 拷貝的種類(lèi)

    • 淺拷貝,只是復(fù)制了一個(gè)指向源對(duì)象的指針,未創(chuàng)建對(duì)象,未分配內(nèi)存
    • 深拷貝,復(fù)制了源對(duì)象,創(chuàng)建了新對(duì)象,分配了內(nèi)存
  • 注意

    • 系統(tǒng)對(duì)容器類(lèi)的對(duì)象與非容器類(lèi)的對(duì)象的內(nèi)存處理是不同的,即當(dāng)一個(gè)沒(méi)有被其他對(duì)象強(qiáng)引用的對(duì)象從容器中移除后,該對(duì)象就銷(xiāo)毀

Copy與Retain


  • copy

    • 是創(chuàng)建一個(gè)新的對(duì)象,內(nèi)容拷貝
    • copy表示的是兩個(gè)對(duì)象的內(nèi)容相同, 新對(duì)象的引用計(jì)數(shù)為1
    • 與舊對(duì)象的引用計(jì)數(shù)無(wú)關(guān),就對(duì)象沒(méi)有變化
    • copy減少了對(duì)象對(duì)上下文的
  • retain

    • 創(chuàng)建的是一個(gè)指針,指針拷貝
    • 對(duì)象地址相同,內(nèi)容固然相同
    • 對(duì)象的引用計(jì)數(shù)+1

不同對(duì)象的拷貝行為


  • 非容器對(duì)象(如NSString))

    • 對(duì)于不可變對(duì)象

      • 規(guī)則

        • copy,淺拷貝(指針復(fù)制)
        • mutableCopy,深拷貝(對(duì)象復(fù)制),返回對(duì)象可變(產(chǎn)生新的 可變對(duì)象)
      • 示例

        - (void)imutableInstanceCopy{    NSString *string = @"Welcome to Xcode";    //copy,淺拷貝    NSString *stringCopy = [string copy];    //mutableCopy,返回的對(duì)象可變    NSMutableString *stringMutableCopy = [string mutableCopy];    [stringMutableCopy appendString:@"!"];    //string與stringCopy的內(nèi)存地址相同    NSLog(@"string: %p", string);    NSLog(@"strongCopy: %p", stringCopy);    //string與stringMutableCopy的內(nèi)存地址不同,分配了新的內(nèi)存    NSLog(@"stringMCopy:%p", stringMutableCopy);}
    • 對(duì)于可變對(duì)象

      • 規(guī)則

        • copy,深拷貝(對(duì)象復(fù)制),返回對(duì)象不可變
        • mutableCopy,深拷貝(對(duì)象復(fù)制)
      • 示例

        - (void)mutableInstanceCopy{    NSMutableString *mutableString = [NSMutableString stringWithString: @"Welcome to Xcode"];    //深拷貝,返回對(duì)象不可變    NSString *stringCopy = [mutableString copy];    NSMutableString *mutableStringCopy = [mutableString copy];    //運(yùn)行時(shí),此句會(huì)報(bào)錯(cuò),錯(cuò)誤信息“Attempt to mutate immutable object with appendString:”    [mutableStringCopy appendString:@"~~~"];    //深拷貝,返回對(duì)象可變    NSMutableString *stringMutableCopy = [mutableString mutableCopy];    [stringMutableCopy appendString:@"!"];    //三者與mutableString的內(nèi)存地址都不同    NSLog(@"mutableString: %p", mutableString);    NSLog(@"string: %p", stringCopy);    NSLog(@"mutableStringCopy: %p", mutableStringCopy);    NSLog(@"stringMutbleCopy:%p", stringMutableCopy);}
  • 容器對(duì)象(NSArray

    • 遵循非容器對(duì)象的拷貝原則
    • 注意

      • 容器內(nèi)的元素是指針賦值(淺拷貝)
      • 示例

        - (void)containerInstanceShallowCopy{    NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"Welcome"],@"to",@"Xcode",nil];    //淺拷貝    NSArray *arrayCopy = [array copy];    //深拷貝    NSMutableArray *arrayMutableCopy = [array mutableCopy];    NSLog(@"array: %p", array);    NSLog(@"arrayCopy: %p", arrayCopy);    NSLog(@"arrayMutableCopy: %p", arrayMutableCopy);    //容器內(nèi)的對(duì)象是淺拷貝,即它們?cè)趦?nèi)存中只有一份    NSMutableString *testString = [array objectAtIndex:0];    [testString appendString:@" you"];    //三個(gè)數(shù)組的內(nèi)容同時(shí)改變    NSLog(@"array[0]: %@", array[0]);    NSLog(@"arrayCopy[0]: %@", arrayCopy[0]);    NSLog(@"arrayMutableCopy[0]: %@", arrayMutableCopy[0]);}
    • 實(shí)現(xiàn)真正意義上的深復(fù)制

      - (void)containerInstanceDeepCopy{    NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"Welcome"],@"to",@"Xcode",nil];    //數(shù)組內(nèi)對(duì)象是指針復(fù)制    NSArray *deepCopyArray = [[NSArray alloc] initWithArray:array];    //真正以上的深復(fù)制,數(shù)組內(nèi)對(duì)象是對(duì)象復(fù)制    NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:array]];    NSLog(@"array: %p", array);    NSLog(@"deepCopyArray: %p", deepCopyArray);    NSLog(@"trueDeepCopyArray: %p", trueDeepCopyArray);    //改變array的第一個(gè)元素    [[array objectAtIndex:0] appendString:@" you"];    //只影響deepCopyArray數(shù)組的第一個(gè)元素    NSLog(@"array[0]: %@", array[0]);    NSLog(@"arrayCopy[0]: %@", deepCopyArray[0]);    //不影響trueDeepCopyArray數(shù)組的第一個(gè)元素,是真正意義上的深拷貝    NSLog(@"arrayMutableCopy[0]: %@", trueDeepCopyArray[0]);}
  • 自定義對(duì)象

    • 在定義對(duì)象要實(shí)現(xiàn)拷貝,需要遵守NSCoping與NSMutableCoping協(xié)議,并實(shí)現(xiàn)以下方法

      • - (id)copyWithZone:(NSZone *)zone,可變拷貝
      • - (id)mutableCopyWithZone:(NSZone *)zone,不可變拷貝
    • 示例(自定對(duì)象Person的拷貝)

      • 遵守協(xié)議,設(shè)置成員屬性

        @interface Person : NSObject <NSCopying, NSMutableCopying>/**姓名*/@PRoperty (nonatomic, copy) NSMutableString *name;/**地址*/@property (nonatomic, copy) NSString *address;/**年齡*/@property (nonatomic, assign) NSInteger age;@end
      • 重寫(xiě)初始化方法

        - (instancetype)init{    if (self = [super init])    {        self.name = [[NSMutableString alloc] initWithString:@"XiaoYaowang"];        self.address = @"世俗孤島";        self.age = 3;    }    return self;}
      • 實(shí)現(xiàn)- (id)copyWithZone:(NSZone *)zone

        - (id)copyWithZone:(NSZone *)zone{    Person *p = [[[self class] allocWithZone:zone] init];    p.name = [self.name copy];    p.address = [self.address copy];    p.age =  self.age;    return p;}
      • 實(shí)現(xiàn)- (id)mutableCopyWithZone:(NSZone *)zone

        - (id)mutableCopyWithZone:(NSZone *)zone{    Person *p = [[[self class] allocWithZone:zone] init];    //注意,此處是mutableCopy方法    p.name = [self.name mutableCopy];    p.address = [self.address copy];    p.age =  self.age;    return p;}

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 中文在线观看免费视频 | 伊人999| 99最新网址| 亚洲最大中文字幕 | 泰剧19禁啪啪无遮挡大尺度 | 成人三级电影网站 | 91短视频版高清在线观看www | sm高h视频 | 午夜在线视频一区二区三区 | 久久免费视频7 | 女人一级一级毛片 | 日本中文高清 | 一级免费看片 | 中文字幕四区 | 国产午夜精品一区二区三区在线观看 | 99精品国产在热久久婷婷 | 久久sp | 啊~用cao嗯力cao烂我视频 | 久久国产精品久久精品国产演员表 | 视频一区 中文字幕 | 久久精品久久久久 | 久久久免费观看完整版 | 午夜神马电影网 | 国产一级一国产一级毛片 | 免费毛片小视频 | 斗破苍穹在线观看免费完整观看 | 色人阁五月天 | 鸳鸯谱在线观看高清 | 久久久久亚洲a | 免费黄色短视频网站 | 欧美成人免费tv在线播放 | 成人一区三区 | japanesexxxx24videofree| 久久思思爱 | 久久精品亚洲精品国产欧美kt∨ | 欧美亚州| 亚洲啊v在线观看 | 久久免费精品 | 手机视频在线播放 | 亚洲精中文字幕二区三区 | 精选久久 |