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

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

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

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

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

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

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

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

第三、retain和copy的區別

  copy與retain的區別:  copy是創建一個新對象,retain是創建一個指針,引用對象計數加1。Copy屬性表示兩個對象內容相同,新的對象retain為1 ,與舊有對象的引用計數無關,舊有對象沒有變化。copy減少對象對上下文的依賴。  retain屬性表示兩個對象地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 曲周县| 伽师县| 丰宁| 明溪县| 池州市| 墨脱县| 丰顺县| 财经| 卢氏县| 平江县| 年辖:市辖区| 保山市| 临汾市| 西丰县| 吴桥县| 鄂尔多斯市| 永泰县| 塘沽区| 焦作市| 卢氏县| 泸溪县| 侯马市| 辽阳市| 恩平市| 都昌县| 丰都县| 桃园市| 保定市| 托克托县| 宁陵县| 灵川县| 临沭县| 金华市| 垦利县| 吉木萨尔县| 黄浦区| 攀枝花市| 阿城市| 石渠县| 通道| 秀山|