首先,明白複製的原則:
然後,明白copy
和mutablecopy
的原則
nsstring使用copy
nsstring *oldstring = [nsstring stringwithformat:@"haha"];
nsstring *newstring = [oldstring copy];
nslog(@"oldstring:%p---newstring:%p",oldstring,newstring);
//列印結果
oldstring:0xa000000616861684---newstring:0xa000000616861684
結論:對不可變物件使用copy不產生新物件,只會進行指標拷貝,即淺拷貝,因為都是不可變物件,不存在修改之後互相影響的情況,所以系統為節約記憶體,只進行了指標拷貝.
nsmutablestring使用copy
nsmutablestring *oldstring = [nsmutablestring stringwithformat:@"haha"];
nsstring *newstring = [oldstring copy];
nslog(@"oldstring:%@---newstring:%@",oldstring,newstring);
nslog(@"oldstring:%p---newstring:%p",oldstring,newstring);
//列印結果
oldstring:hahachange---newstring:haha
oldstring:
0x60800027ef80---newstring:
0xa000000616861684
結論:對可變物件使用copy會產生新的物件,新物件為不可變物件,對新物件或原物件修改不會互相影響
nsstring使用mutablecopy
nsstring *oldstring = [nsstring stringwithformat:@"haha"];
nsmutablestring *new
string = [oldstring mutablecopy];
[new
nslog(@"oldstring:%@---newstring:%@",oldstring,new
string);
nslog(@"oldstring:%p---newstring:%p",oldstring,new
string);
//列印結果
oldstring:haha---newstring:hahachange
oldstring:0xa000000616861684---newstring:0x6000002688c0
結論:對不可變物件使用mutablecopy會產生新的物件,新物件為可變物件,對新物件或原物件修改不會互相影響
nsmutablestring使用mutablecopy
nsmutablestring *oldstring = [nsmutablestring stringwithformat:@"haha"];
nsmutablestring *new
string = [oldstring mutablecopy];
[new
nslog(@"oldstring:%@---newstring:%@",oldstring,new
string);
nslog(@"oldstring:%p---newstring:%p",oldstring,new
string);
//列印結果
oldstring:haha---newstring:hahachange
oldstring:0x600000261240---newstring:0x600000262300
結論:對可變物件使用mutablecopy會產生新的物件,新物件為可變物件,對新物件或原物件修改不會互相影響
@property中的copy使用
在普通的strong
修飾的屬性生成的set
方法實現為簡單賦值,即:
@property (nonatomic, strong) nsstring *name;
- (void)setname:(nsstring *)name
而使用copy
修飾的屬性生成的set
方法則是把傳入物件拷貝乙份記憶體賦值給成員變數,即:
@property (nonatomic, strong) nsstring *name;
- (void)setname:(nsstring *)name
結論:這樣我們就可以達到對賦值前後的物件之間修改不會互相影響
但是這樣的話就會出現一種特殊情況,當成員變數是可變型別的時候,通過copy出來的是不可變物件,賦值給成員變數後其本質上已經為不可變物件,然後我們仍會誤以為其實可變物件,而呼叫一些可變物件的方法,此時程式會崩潰:
@property (nonatomic, copy) nsmutablestring *mutablestring;
self.mutablestring = [nsmutablestring stringwithformat:@"test"];
結論:我們要避免對可變物件使用copy
深入物件的copy和mutableCopy
深入理解copy和mutablecopy必須要先理解堆 heap 和棧 stack 的區別,以下鏈結來自stack overflow的詳細解答。簡要的一句話就是 物件儲存在堆中,該物件在堆中便有了乙個記憶體位址,該位址屬於棧中的乙個變數 指標 這個變數在棧中也占有一段記憶體。對於不可變物件copy是...
copy模組中的copy與deepcopy的區別
每空閒下來,就覺得以前寫的部落格很low.也許現在也很low 好吧就當公升級版的low吧 如果要了解copy與deepcopy的區別,就需要了解python的儲存機制 python在賦值會在記憶體裡開闢乙個空間來存放值這就叫 記憶體位址 同時會開闢乙個空間來存放名字叫命名,在資料相同長度在一定範圍 ...
關於python深copy與淺copy的一點理解
一直對python深copy和淺copy似懂非懂的狀態,看了這篇文章,覺得自己懂了很多,給各位參考!出處 import copy a 1 不可變資料型別 copy a copy.copy a print id a id copy a 記憶體位址相同 a 1,2 可變資料型別 copy a copy....