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

首頁 > 系統 > iOS > 正文

IOS ObjectiveC中的賦值與對象拷貝

2020-07-26 02:40:21
字體:
來源:轉載
供稿:網友

IOS ObjectiveC中的賦值與對象拷貝

在開發過程中我們經常會遇到對象拷貝的問題,下面我們分別討論賦值操作、對象拷貝、以及淺拷貝(Shallow copy)與深拷貝(Deep copy)的區別與各自的實現方式。

一、不同對象的賦值操作

Objective-C中有兩類對象,一類是結構體(或者基本數據類型也算),另一類是NSObject對象。

對于結構體,代碼直接會操作其實體,因此賦值操作會創建一個源對象的副本(一個新的對象);而對于NSObject對象,必須使用指針來操作對象,所以其賦值操作相當于復制了指針,而非對象,也就是說賦值操作使得源指針和新指針都指向同一個NSObject對象。這樣講有些難以理解,請看下面的代碼:

// main.m  #import <Foundation/Foundation.h>  @interface TestObject : NSObject {   @public   int x;   int y; } @end  @implementation TestObject @end  typedef struct TestStruct {   int x;   int y; } TestStruct;  int main(int argc, const char * argv[]) {    @autoreleasepool {          TestStruct ts1 = {100, 50};     NSLog(@"ts1: %p, %d, %d", &ts1, ts1.x, ts1.y);          TestStruct ts2 = ts1;     NSLog(@"ts2: %p, %d, %d", &ts2, ts2.x, ts2.y);      TestObject* to1 = [[[TestObject alloc] init] autorelease];     NSLog(@"to1: %p, %d, %d", to1, to1->x, to1->y);          TestObject* to2 = to1;     NSLog(@"to2: %p, %d, %d", to2, to2->x, to2->y);        }   return 0; } 

程序的運行結果如下:

ts1: 0x7fff63463898, 100, 50 ts2: 0x7fff63463890, 100, 50 to1: 0x7fc342d00370, 0, 0 to2: 0x7fc342d00370, 0, 0 

程序代碼首先定義了一個類TestObject(繼承自NSObject),然后又定義了一個結構體TestStruct。這兩者都包含兩個整型的成員變量x和y。然后在main函數中,程序首先為TestStruct結構體ts1分配內存空間,并為其成員變量賦初值,x為100,y為50。然后通過NSLog函數打印出該結構體的地址和成員變量的值,即輸出的第一行內容。接著,程序執行了賦值語句,將ts1賦值給另一個TestStruct結構體對象ts2,這條語句會為ts2分配另一塊內存,然后把ts1的每個成員變量的值復制過來。第二行輸出也可以看出來,地址不一樣了,所以如果修改ts1的成員變量的值,是不會影響ts2的。

接著再來看TestObject。程序接著使用alloc靜態方法分配了一塊新的內存空間,然后通過init實例方法進行初始化(所有成員變量的值為0),最后將該內存空間的首地址返回。to1的實質就是一個指針,指向創建的TestObject對象。接著,程序將to1賦值給to2。to2也是一個指向TestObject對象的指針,其值與to1一樣,即兩者都指向同一個對象。所以在這種情況下,對to1的修改會同時影響to2。

二、對象拷貝

Foundation框架的NSObject類提供了兩個方法,分別是copy和mutableCopy方法,用于對NSObject對象進行拷貝操作。copy方法會調用NSCopying協議的copyWithZone:方法,而mutableCopy會調用 NSMutableCopying協議的mutableCopyWithZone:方法。將上面的代碼修改如下:

#import <Foundation/Foundation.h>  @interface TestObject : NSObject {   @public   int x;   int y; } @end  @implementation TestObject - (NSString*)description {   return [NSString stringWithFormat:@"%@: %p, x: %d, y: %d", [self class], self, x, y]; } @end  typedef struct TestStruct {   int x;   int y; } TestStruct;  int main(int argc, const char * argv[]) {   @autoreleasepool   {         TestObject* to1 = [[[TestObject alloc] init] autorelease];     to1->x = 100; to1->y = 50;     TestObject* to2 = [[[TestObject alloc] init] autorelease];     to2->x = 200; to2->y = 400;     TestObject* to3 = [[[TestObject alloc] init] autorelease];     to3->x = 300; to3->y = 500;          //創建包含to1, to2, to3的數組array1     NSArray* array1 = [NSArray arrayWithObjects:to1, to2, to3, nil];     NSLog(@"array1: %p, /n%@", array1, array1);          //array2是array1調用copy的結果     NSArray* array2 = [array1 copy];     NSLog(@"array2: %p, /n%@", array2, array2);     [array2 release];          //mutableArray2是array1調用mutableCopy的結果     NSMutableArray* mutableArray2 = [array1 mutableCopy];     NSLog(@"mutableArray2: %@, %p, /n%@", [mutableArray2 class], mutableArray2, mutableArray2);     [mutableArray2 removeLastObject];          NSLog(@"After remove last object of mutableArray2");          NSLog(@"array1: %p, /n%@", array1, array1);     NSLog(@"array2: %p, /n%@", array2, array2);     NSLog(@"mutableArray2: %p, /n%@", mutableArray2, mutableArray2);          //mutableArray3是mutableArray2調用mutableCopy的結果     NSMutableArray* mutableArray3 = [mutableArray2 mutableCopy];     NSLog(@"mutableArray3: %p, /n%@", mutableArray3, mutableArray3);     [mutableArray2 release];          //array4是mutableArray3調用copy的結果     NSArray* array4 = [mutableArray3 copy];     NSLog(@"array4: %@, %p, /n%@", [array4 class], array4, array4);     [mutableArray3 release];     [array4 release];   }   return 0; } 

程序的運行結果如下:

2012-03-22 19:20:49.548 ObjectCopy[18042:403] array1: 0x7f9071414820,  (   "TestObject: 0x7f90714141b0, x: 100, y: 50",   "TestObject: 0x7f90714141c0, x: 200, y: 400",   "TestObject: 0x7f9071414230, x: 300, y: 500" ) 2012-03-22 19:20:49.550 ObjectCopy[18042:403] array2: 0x7f9071414820,  (   "TestObject: 0x7f90714141b0, x: 100, y: 50",   "TestObject: 0x7f90714141c0, x: 200, y: 400",   "TestObject: 0x7f9071414230, x: 300, y: 500" ) 2012-03-22 19:20:49.551 ObjectCopy[18042:403] mutableArray2: __NSArrayM, 0x7f9072800000,  (   "TestObject: 0x7f90714141b0, x: 100, y: 50",   "TestObject: 0x7f90714141c0, x: 200, y: 400",   "TestObject: 0x7f9071414230, x: 300, y: 500" ) 2012-03-22 19:20:49.552 ObjectCopy[18042:403] After remove last object of mutableArray2 2012-03-22 19:20:49.552 ObjectCopy[18042:403] array1: 0x7f9071414820,  (   "TestObject: 0x7f90714141b0, x: 100, y: 50",   "TestObject: 0x7f90714141c0, x: 200, y: 400",   "TestObject: 0x7f9071414230, x: 300, y: 500" ) 2012-03-22 19:20:49.553 ObjectCopy[18042:403] array2: 0x7f9071414820,  (   "TestObject: 0x7f90714141b0, x: 100, y: 50",   "TestObject: 0x7f90714141c0, x: 200, y: 400",   "TestObject: 0x7f9071414230, x: 300, y: 500" ) 2012-03-22 19:20:49.553 ObjectCopy[18042:403] mutableArray2: 0x7f9072800000,  (   "TestObject: 0x7f90714141b0, x: 100, y: 50",   "TestObject: 0x7f90714141c0, x: 200, y: 400" ) 2012-03-22 19:20:49.557 ObjectCopy[18042:403] mutableArray3: 0x7f90729000d0,  (   "TestObject: 0x7f90714141b0, x: 100, y: 50",   "TestObject: 0x7f90714141c0, x: 200, y: 400" ) 2012-03-22 19:20:49.558 ObjectCopy[18042:403] array4: __NSArrayI, 0x7f9071416e70,  (   "TestObject: 0x7f90714141b0, x: 100, y: 50",   "TestObject: 0x7f90714141c0, x: 200, y: 400" ) 

程序的運行結果有幾點值得注意,首先是array1與array2的地址相同,因為NSArray對象在創建之后是不可以修改的。其次,NSArray的mutableCopy方法會返回一個NSMutableArray對象。第三,對于NSArray或者NSMutableArray來說,mutableCopy方法會創建新的可變數組對象,但其每個數組成員的值僅僅是原數組的一個指針賦值,這就是淺拷貝。而與之相對的則是深拷貝,即復制數組時不是復制數組每個元素的引用,而是創建一個與之相同的新對象。

第四,在NSArray對象上調用mutableCopy方法返回一個NSMutableArray對象,而在NSMutableArray對象上調用copy方法則返回一個NSArray對象,而不是NSMutableArray對象。

當然,以上討論的是Foundation框架中的NSArray與NSMutableArray類,如果想要實現對自己創建的類的對象進行拷貝,則需要讓類實現NSCopying協議。

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久av| 成人激情免费在线| 欧美日韩另类在线| 亚洲欧美制服丝袜| 欧美黑人极品猛少妇色xxxxx| 国产成人免费av电影| 国产精品高精视频免费| 亚洲国产精品久久久久秋霞不卡| 2018中文字幕一区二区三区| 亚洲无亚洲人成网站77777| 欧美一区亚洲一区| 精品国产成人av| 国产一区视频在线| 最近的2019中文字幕免费一页| 亚洲综合最新在线| 91精品国产综合久久香蕉922| 国产亚洲激情视频在线| 国产成人福利视频| 日韩一区二区在线视频| 国产精品美女在线观看| 久久久免费精品| 国产91精品青草社区| 国产欧美一区二区白浆黑人| 亚洲午夜精品视频| 久久综合伊人77777蜜臀| 亚洲成人激情小说| 激情成人中文字幕| 亚洲欧美激情一区| 91网站在线免费观看| 97色在线观看免费视频| 美女福利精品视频| 国产精品欧美日韩久久| 久久久www成人免费精品| 亚洲精品国产综合区久久久久久久| 97在线视频观看| 日韩av手机在线| 日韩免费在线免费观看| 成人乱人伦精品视频在线观看| 亚洲伊人第一页| 亚洲国产成人爱av在线播放| 亚洲精品久久久久久久久久久久| 97成人在线视频| 国产精品爱啪在线线免费观看| 亚洲一二三在线| 日韩av在线高清| 欧美福利视频在线| 欧美日韩亚洲一区二区三区| 美女扒开尿口让男人操亚洲视频网站| 午夜精品一区二区三区av| 精品久久久久久久久久久久久久| 国产欧美va欧美va香蕉在线| 91亚洲va在线va天堂va国| 国产精品一区二区性色av| 国产亚洲精品美女| 91视频-88av| 久久免费高清视频| 精品国内亚洲在观看18黄| 中文字幕欧美精品日韩中文字幕| 国产欧美 在线欧美| 欧美激情网友自拍| 92国产精品久久久久首页| 在线观看成人黄色| 欧美精品18videos性欧美| 亚洲一区二区福利| 九九热最新视频//这里只有精品| 日韩av男人的天堂| 欧美黑人巨大精品一区二区| 欧美性xxxxxxxxx| 91久久精品久久国产性色也91| 久久久精品日本| 国产精品自拍视频| 日韩av一区二区在线观看| 欧美日韩国产一区二区| 亚洲精品自拍偷拍| 欧美在线视频免费播放| 国产欧美日韩综合精品| 国产精品视频yy9099| 日韩欧美国产视频| 97精品欧美一区二区三区| 久久五月天色综合| 韩国视频理论视频久久| 社区色欧美激情 | 最近2019中文免费高清视频观看www99| 色偷偷噜噜噜亚洲男人| 精品久久久一区二区| 久久夜色精品国产| 精品国产一区二区三区在线观看| 这里只有精品久久| 欧美电影在线观看网站| 色樱桃影院亚洲精品影院| 欧美在线视频免费| 亚洲精品一区av在线播放| 国产情人节一区| 亚洲片在线观看| 国产色视频一区| 国产成人亚洲综合91精品| 国产欧美久久久久久| 亚洲精品永久免费精品| 最好看的2019年中文视频| 精品中文字幕在线2019| 亚洲石原莉奈一区二区在线观看| 亚洲欧美变态国产另类| 亚洲精品久久久久久久久久久久| 668精品在线视频| 国产97色在线| 欧美高清在线观看| 热99久久精品| 国产极品精品在线观看| 国产成人jvid在线播放| 欧美激情小视频| 亚洲第一视频网站| 91深夜福利视频| 欧美午夜www高清视频| 91精品视频免费观看| 色婷婷成人综合| 成人精品久久av网站| 久久久免费在线观看| 欧美日韩精品中文字幕| 欧美高清性猛交| 日韩免费av片在线观看| 国产成人激情视频| 黄色精品在线看| 国产噜噜噜噜噜久久久久久久久| 日韩大胆人体377p| 91在线无精精品一区二区| 亚洲欧美激情精品一区二区| 亚洲三级av在线| 亚洲精品成人免费| 亚洲永久在线观看| 久久久97精品| 成人在线精品视频| 欧美午夜性色大片在线观看| 国产精品海角社区在线观看| 日韩网站免费观看| 国产一区二区三区精品久久久| 久久av.com| 欧美国产激情18| 国产在线视频一区| 伊人久久久久久久久久久| 一区二区亚洲精品国产| 91av在线网站| 久久精品国产69国产精品亚洲| 在线视频一区二区| 日韩视频亚洲视频| 久久精品亚洲94久久精品| 亚洲变态欧美另类捆绑| 日韩a**站在线观看| 国产成人涩涩涩视频在线观看| 久操成人在线视频| www.午夜精品| 欧美日本高清一区| 日本道色综合久久影院| 欧美国产精品日韩| 欧美激情日韩图片| 91九色视频导航| 久久夜精品va视频免费观看| 午夜免费在线观看精品视频| www.欧美视频| 另类图片亚洲另类| 亚洲国产97在线精品一区| 亚洲欧美自拍一区| 中文字幕在线成人| 久久久电影免费观看完整版| 欧美在线欧美在线|