亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

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

2019-11-14 18:20:49
字體:
來源:轉載
供稿:網友

概述


  • 拷貝:復制一個與源對象內容相同的對象
  • 實現拷貝,需要遵守以下兩個協議

    • NSCopying
    • NSMutableCopying
  • 拷貝返回對象的種類

    • 可變,mutableCopy消息返回的對象
    • 不可變,copy消息返回的對象
  • 拷貝的種類

    • 淺拷貝,只是復制了一個指向源對象的指針,未創建對象,未分配內存
    • 深拷貝,復制了源對象,創建了新對象,分配了內存
  • 注意

    • 系統對容器類的對象與非容器類的對象的內存處理是不同的,即當一個沒有被其他對象強引用的對象從容器中移除后,該對象就銷毀

Copy與Retain


  • copy

    • 是創建一個新的對象,內容拷貝
    • copy表示的是兩個對象的內容相同, 新對象的引用計數為1
    • 與舊對象的引用計數無關,就對象沒有變化
    • copy減少了對象對上下文的
  • retain

    • 創建的是一個指針,指針拷貝
    • 對象地址相同,內容固然相同
    • 對象的引用計數+1

不同對象的拷貝行為


  • 非容器對象(如NSString))

    • 對于不可變對象

      • 規則

        • copy,淺拷貝(指針復制)
        • mutableCopy,深拷貝(對象復制),返回對象可變(產生新的 可變對象)
      • 示例

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

      • 規則

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

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

    • 遵循非容器對象的拷貝原則
    • 注意

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

        - (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);    //容器內的對象是淺拷貝,即它們在內存中只有一份    NSMutableString *testString = [array objectAtIndex:0];    [testString appendString:@" you"];    //三個數組的內容同時改變    NSLog(@"array[0]: %@", array[0]);    NSLog(@"arrayCopy[0]: %@", arrayCopy[0]);    NSLog(@"arrayMutableCopy[0]: %@", arrayMutableCopy[0]);}
    • 實現真正意義上的深復制

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

    • 在定義對象要實現拷貝,需要遵守NSCoping與NSMutableCoping協議,并實現以下方法

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

      • 遵守協議,設置成員屬性

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

        - (instancetype)init{    if (self = [super init])    {        self.name = [[NSMutableString alloc] initWithString:@"XiaoYaowang"];        self.address = @"世俗孤島";        self.age = 3;    }    return self;}
      • 實現- (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;}
      • 實現- (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;}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精欧美一区二区三区| 欧美日韩在线一区| 欧美日韩福利视频| 国产综合香蕉五月婷在线| 欧美激情欧美狂野欧美精品| 亚洲天堂av高清| 国产精品成人观看视频国产奇米| 亚洲人a成www在线影院| 亚洲 日韩 国产第一| 日韩电影免费在线观看中文字幕| 2020久久国产精品| 精品视频9999| 黑丝美女久久久| 久久精品国产视频| 91精品国产成人www| 精品女同一区二区三区在线播放| 日韩在线精品视频| 亚洲精品久久久久久久久久久| 亚洲精品美女在线观看播放| 精品久久久999| 国产精品久久久久久久久男| 中文字幕欧美视频在线| 日韩美女毛茸茸| 亚洲一区二区三区sesese| 亚洲老头老太hd| 久久久91精品国产一区不卡| 一区二区av在线| 久久视频精品在线| 亚洲第一精品久久忘忧草社区| 日韩有码在线电影| 久久久这里只有精品视频| 欧美日韩成人在线播放| 久久久久久久久久国产精品| 另类美女黄大片| 亚洲精品美女在线观看播放| 国产精品91一区| 久久久999成人| 91亚洲精品久久久久久久久久久久| 欧美精品videosex性欧美| 国产精品成人在线| 成人午夜两性视频| 久久婷婷国产麻豆91天堂| 国产精品精品视频一区二区三区| 欧美野外猛男的大粗鳮| 91在线观看免费| 欧洲精品在线视频| 亚洲mm色国产网站| 黄色一区二区在线观看| 国产精品人人做人人爽| 欧美精品在线免费播放| 国产一区二区三区在线视频| 狠狠久久亚洲欧美专区| 欧美精品日韩www.p站| 精品国产乱码久久久久久虫虫漫画| 欧美国产日本高清在线| 欧美日韩国产色| 狠狠躁夜夜躁人人爽天天天天97| 欧美性猛交xxxx黑人| 久久精品夜夜夜夜夜久久| 亚洲小视频在线| 欧美日韩亚洲精品内裤| 亚洲国模精品一区| 成人免费福利视频| 欧美激情欧美激情在线五月| 久久精品成人一区二区三区| 色噜噜久久综合伊人一本| 国产成人+综合亚洲+天堂| 57pao精品| 午夜精品蜜臀一区二区三区免费| 中文字幕亚洲欧美一区二区三区| 日本久久久久久久久| 91社影院在线观看| 亚洲第一精品夜夜躁人人爽| 日韩在线免费视频观看| 亚洲精品影视在线观看| 国产精品久久久久久中文字| 中文字幕一区电影| 亚洲欧美在线一区| 91国在线精品国内播放| 国产精品久在线观看| 国产成人综合av| 在线精品高清中文字幕| 国产69精品久久久久久| 国产一区二区三区日韩欧美| 亚洲精品一区二区三区婷婷月| 福利精品视频在线| 欧美在线一级va免费观看| 欧美人与性动交a欧美精品| 91爱爱小视频k| 清纯唯美日韩制服另类| 26uuu另类亚洲欧美日本老年| 国产精品第一区| 欧美性生交xxxxx久久久| 亚洲精品一区二区久| 伊人久久大香线蕉av一区二区| 亚洲美女av网站| 精品久久久久久久久中文字幕| 久久精品成人一区二区三区| 久久99热精品这里久久精品| 97在线精品国自产拍中文| 久久久视频免费观看| 欧美在线中文字幕| 亚洲一区二区三区在线视频| 日韩亚洲精品电影| 亚洲欧美综合另类中字| 91高潮精品免费porn| 亚洲精品久久久久中文字幕欢迎你| 91chinesevideo永久地址| 国产亚洲视频中文字幕视频| 欧美国产高跟鞋裸体秀xxxhd| 国产主播精品在线| 亚洲一区二区福利| 久精品免费视频| 久久久久久这里只有精品| 久久久999精品| 欧美高清一级大片| 久久国内精品一国内精品| 亚洲人线精品午夜| 久久亚洲国产精品成人av秋霞| 欧美亚洲另类在线| 久久久久国产精品免费网站| 亚洲精品99久久久久| 亚洲欧美激情另类校园| 亚洲国产成人91精品| 国产精品白丝av嫩草影院| 欧美成人精品h版在线观看| 亚洲欧美色婷婷| 日本中文字幕成人| 77777亚洲午夜久久多人| 日韩中文字幕国产| 欧美精品久久久久久久久久| 国产精品专区一| 伊人久久精品视频| 日韩成人av一区| 久久韩剧网电视剧| 国产精品久久久久久久9999| 国产丝袜精品第一页| 国产精品国产三级国产专播精品人| 国产欧美一区二区三区在线看| 欧美激情乱人伦一区| 韩国视频理论视频久久| 亚洲最大成人免费视频| 日本中文字幕成人| 欧洲亚洲女同hd| 国产精品日日做人人爱| 亚洲欧美激情在线视频| 亲子乱一区二区三区电影| 日韩美女激情视频| 久久九九全国免费精品观看| 亚洲国内精品在线| 久久精品一区中文字幕| 国产视频精品免费播放| 美女av一区二区三区| 欧美性猛交xxxx乱大交| 亚洲欧美日韩天堂一区二区| 按摩亚洲人久久| 亚洲第一男人av| 欧美日韩一区二区免费在线观看| 亚洲free性xxxx护士hd| 日韩精品视频在线观看网址| 欧美肥老太性生活视频| 精品偷拍一区二区三区在线看| 国产视频亚洲视频| 日韩成人在线视频观看|