//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...