Objective-C 深拷貝與淺拷貝

來源:互聯網
上載者:User

標籤:拷貝   objective   nsmutablestring   

深拷貝與淺拷貝淺拷貝
  • 淺拷貝 (shallow copy)     特點:不會複製所引用的對象,其新複製的對象只是一個指標,指向現有的引用對象上.(其實就相當於 Windows 系統下的捷徑的複製)
    下面舉一個簡單地例子來分別下深拷貝與淺拷貝:
//建立兩個可變的字串NSMutableString *student = [[NSMutableString alloc] initWithString:@"ZhangSan"];        NSMutableString *anotherStu= [[NSMutableString alloc] initWithString:@"LiSi"];//     使用兩個可變的字串來建立數組,也就是組裡的有兩個元素,其元素類型是可變字串        NSArray *students = @[student,anotherStu];//     用建立好的數組copy一份賦值給另外一個數組        NSArray *copyStu = [students copy];//     列印原數組和複製得到的數組的內容        NSLog(@"before moidfy the students:%@ and copyStu:%@",students,copyStu);//     修改複製後得到的數組的第一個元素的值        [copyStu[0] appendString:@"-TeacherZhang"];//     列印原數組的值, 查看是否發生了變化        NSLog(@"after modify copyStu:  the students info:%@",students);

列印出結果是before moidfy the students:(
ZhangSan,
LiSi
) and copyStu:(
ZhangSan,
LiSi
)
after modify copyStu: the students info:(
“ZhangSan-TeacherZhang”,
LiSi
)
這就是淺拷貝,只是拷貝了一個指標,並沒有拷貝一個完整的對象.

深拷貝
  • 深拷貝 (deep copy)    

特點:真正意義上的複製概念.得到的結果是多個,而非只是對象的引用. (對象的完全複製,包括其中的方法)

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {//      定義了一個不可變字串        NSString *str = @"hello";         //列印出 str 的地址        NSLog(@"str‘s address:%p",str);        //通過mutableCopy協議可以將不可變的字串轉化為可變字串        NSMutableString *anotherStr = [str mutableCopy];        NSLog(@"anotherStr‘s address:%p",anotherStr);        [anotherStr appendString:@"qingyun"];        NSLog(@"anotherString:%@",anotherStr);        NSMutableString *mStr = [[NSMutableString alloc] initWithString:@"HELLO"];        NSLog(@"mStr‘s address:%p",mStr);//        通過copy協議可以將可變字串轉換為不可變字串        NSMutableString *anotherMStr = [mStr copy];        NSLog(@"anotherMStr‘s address:%p",anotherMStr);        [anotherMStr appendString:@"-QINGYUN"];    }    return 0;}
自訂對象的拷貝

實現自訂對象的拷貝的前提是必須要實現協議,否則,自訂對象調用 copy 對象的時候會發生崩潰的現象.
執行個體來說明這個問題,建立一個 QYCar 的類繼承自 NSObject, 且遵從 NSCopying 協議,在 main.m 中實現自訂對象的 copy

在 QYCar 的標頭檔中,代碼如下:

#import <Foundation/Foundation.h>@interface QYCar : NSObject <NSCopying>@property (nonatomic, strong)NSString *name;@property (nonatomic, assign)NSInteger year;@end

在 QYCar.m 中的代碼如下:

#import "QYCar.h"@implementation QYCar//開箱即用的初始化方式- (instancetype)init{    self = [super init];    if (self) {        self.name = @"BWM";        self.year = 2013;    }    return self;}- (NSString *)description{    return [NSString stringWithFormat:@"name:%@,year:%ld", self.name,self.year];}- (id)copyWithZone:(NSZone *)zone{    QYCar *carCopy;    carCopy = [QYCar allocWithZone:nil];    carCopy.name = self.name;    carCopy.year = self.year;    return carCopy;}@end

在 main.m 中建立一個對象 car, 並調用開箱即用的初始化方式,然後再建立一個對象 carCopy, 並把 car 的內容 copy 給 carCopy, 為了顯示我們成功拷貝了 car, 更改 carCopy 的 name 屬性,並列印出來,顯示下我們這是深拷貝.

int main(int argc, const char * argv[]) {    @autoreleasepool {        QYCar *car = [[QYCar alloc] init];        NSLog(@"car:%@",car);        QYCar *carCopy = [car copy];        carCopy.name = @"HeNanCar";        NSLog(@"carCopy:%@",carCopy);        NSLog(@"car again : %@",car);     }     return 0;}     

輸出的結果是:
2015-07-01 21:06:43.302 SelfWithCopy[2631:2055248] car:name:BWM,year:2013
2015-07-01 21:06:43.303 SelfWithCopy[2631:2055248] carCopy:name:HeNanCar,year:2013
2015-07-01 21:06:43.303 SelfWithCopy[2631:2055248] car again : name:BWM,year:2013

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Objective-C 深拷貝與淺拷貝

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.