oc學習之旅 陣列淺拷貝深拷貝

2021-06-19 22:25:05 字數 2352 閱讀 9973

//copy

nsstring * str1 = @"wahaha";

nsstring * str2 = [str1 copy];

nsstring * str3 = [str1 retain];

nslog(@"str1 %p str2 %p str4 %p",str1,str2,str3);

nsmutablestring*str4 = [nsmutablestring

stringwithstring

:@"wahaha"];

nsmutablestring *str6 = [str4 retain];

nsmutablestring *str5 = [str4 copy];

nslog(@"str4 %p str5 %p str6 %p",str4,str5,str6);

nslog(

@"%ld %ld %ld"

,str4.retaincount,str5.retaincount,str6.retaincount);

//str6後追加

nslog(@"str4 %@ str5 %@ str6 %@",str4,str5,str6);/*

retain:空間一直

引用計數加1

copy: copy對此昂引用計數為1

1.copy 物件是不可變物件時

與retain類似

2.copy 物件時可變物件時

釋放拷貝物件 */

//mutablecopy

nsstring * str7 = @"wahaha";

nsstring * str8 = [str7 mutablecopy];

nsstring * str9 = [str7 retain];

nslog(@"str7 %p str8 %p str9 %p",str7,str8,str9);/*

mutablecopy:引用計數與copy一致

不管物件是否可變都會拷貝乙份新的空間*****改空間可以被修改

*/person *p = [[person

alloc] init];

person *p1 = [p copy];

person *p2 = [p mutablecopy];/*

自定義類支援copy:

1.該類中必須遵守copying協議

2.在該類中實現copywithzone

*/[p release];/*

p1:0x0001->0x0010

0x0011

0x0002->0x0020

0x0021

0x0003->0x0030

0x0021

淺拷貝p2

0x0001->0x0010

0x0011

0x0002->0x0020

0x0021

0x0003->0x0030

0x0021

深拷貝p2:一層一層全部拷貝乙份

*/nsmutablearray* arr1 = [nsmutablearray

array];

for (int i =0; i<3; i++)

//淺拷貝

nsmutablearray *arr2 =[[nsmutablearray

alloc] initwitharray:arr1];

//深拷貝

//使用該方法的前提是

被拷貝物件實現了copywithzone 方法

nsmutablearray *arr3 = [[nsmutablearray

alloc] initwitharray:arr1 copyitems:yes];

nslog

(@"arr1 is %@ arr2 is %@ arr3 is%@",arr1,arr2,arr3);

person.h

//父類後接協議名》 表示該類遵守***協議

@inte***ce

person : nsobject

@property(nonatomic,assign)

nsinteger

cbid;

@property(nonatomic,copy)

nsstring

* name;

person.m

@synthesizename =

_name;

@synthesizecbid =

_cbid;

//支援拷貝必須實現的方法該方法在[p copy]時呼叫

-(id)copywithzone:(nszone *)zone

-(id)mutablecopywithzone:(nszone *)zone

OC學習 淺拷貝和深拷貝

淺拷貝和深拷貝區別是什麼?淺拷貝就是指 指標的賦值 深拷貝就是開闢了乙個新的空間 在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體.深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體.採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶...

陣列拷貝(深拷貝 淺拷貝)

底層都是使用system.arraycopy object src,int srcpos,object dest,int destpos,int length 方法完成陣列元素拷貝任務的 方法說明 如果newlength original.length,那麼會將原陣列中前newlength個元素拷貝...

淺拷貝 深拷貝

copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...