国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

深入理解object C中復制對象的用法

2019-11-09 17:57:15
字體:
來源:轉載
供稿:網友

第一、復制對象的基本概念

復制一個對象為副本,開辟一塊新的內存來存儲副本對象。

第二、如果一個對象想具備復制的功能,必須實現<NSCopying>協議和<NSMutableCopying>協議

NSObject自帶的常用的對象有:NSNumber、NSString、NSArray、NSDictionary、NSMutableArray、NSMutableDictionay、NSMutableString,copy產生的對象時不可變的,mutableCopy產生的對象時可變的

第三、retain和copy的區別

  copy與retain的區別:  copy是創建一個新對象,retain是創建一個指針,引用對象計數加1。Copy屬性表示兩個對象內容相同,新的對象retain為1 ,與舊有對象的引用計數無關,舊有對象沒有變化。copy減少對象對上下文的依賴?! etain屬性表示兩個對象地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1也就是說,retain 是指針拷貝,copy 是內容拷貝。    當然在ios中并不是所有的對象都支持copy,mutableCopy,遵守NSCopying 協議的類可以發送copy消息,遵守NSMutableCopying 協議的類才可以發送mutableCopy消息。假如發送了一個沒有遵守上訴兩協議而發送 copy或者 mutableCopy,那么就會發生異常。但是默認的ios類并沒有遵守這兩個協議。如果想自定義一下copy 那么就必須遵守NSCopying,并且實現 copyWithZone: 方法,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實現 mutableCopyWithZone: 方法。

    @autoreleasepool {        NSMutableArray *array=[NSMutableArray arrayWithObjects:@"one",@"two",@"three",@"four",nil];        NSMutableArray *retainArray=[array retain];        [retainArray removeLastObject];        for(NSString *str in array)        {            NSLog(@"the part is %@",str);        }        NSLog(@"the retaincount is %ld",[retainArray retainCount]);        // insert code here...        NSLog(@"Hello, World!");            }

第四、COPY和MutableCopy的區別

COPY 返回一個不可變對象的副本,MutalbeCopy返回一個可變對象的副本。

NSArray *array=[NSArray arrayWithObjects:@"one",@"two", nil];        NSMutableArray *array1=[array copy];        [array1 addObject:@"three"];  //error        NSMutableArray *array2=[array mutableCopy];        [array2 addObject:@"three"];  //right        // insert code here...        NSLog(@"Hello, World!");第五、淺copy和深copy

淺復制盡復制對象本身,對象里的屬性、包含的對象不做復制

深復制復制全部,包括對象的屬性和其他對象

Foundation框架支持復制的類,默認是淺復制

NSMutableArray *array=[[NSMutableArray alloc] init];        for(int i=0;i<3;i++)        {            NSObject *obj=[[NSObject alloc] init];            [array addObject:obj];            [obj release];        }        for(NSObject *obj1 in array)        {            NSLog(@"地址為 %p,引用計數是 %ld",obj1,obj1.retainCount);        }        NSMutableArray *array2=[array copy];        for(NSObject *obj2 in array2)        {            NSLog(@"地址為 %p,引用計數是 %ld",obj2,obj2.retainCount);        }
2013-09-30 17:28:01.492 FDAS[681:303] 地址為 0x1001081f0,引用計數是 12013-09-30 17:28:01.506 FDAS[681:303] 地址為 0x100108230,引用計數是 12013-09-30 17:28:01.506 FDAS[681:303] 地址為 0x100108240,引用計數是 12013-09-30 17:28:01.507 FDAS[681:303] 地址為 0x1001081f0,引用計數是 22013-09-30 17:28:01.507 FDAS[681:303] 地址為 0x100108230,引用計數是 22013-09-30 17:28:01.507 FDAS[681:303] 地址為 0x100108240,引用計數是 2
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吴川市| 涞源县| 徐州市| 资兴市| 万载县| 电白县| 白沙| 绥化市| 昌平区| 社会| 屏山县| 且末县| 淮北市| 尤溪县| 株洲县| 霍山县| 平谷区| 清涧县| 枣阳市| 平安县| 靖宇县| 汨罗市| 松滋市| 阿拉善盟| 平邑县| 陆丰市| 南靖县| 马鞍山市| 白朗县| 奈曼旗| 会昌县| 木里| 南部县| 介休市| 桑植县| 双鸭山市| 山丹县| 吴旗县| 保靖县| 梅河口市| 正宁县|