OC細節,警方公開槍戰細節

來源:互聯網
上載者:User

OC細節,警方公開槍戰細節

概述

  • 拷貝:複製一個與來源物件內容相同的對象
  • 實現拷貝,需要遵守以下兩個協議

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

---恢複內容結束---

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.