Copy與MutableCopy的使用

2021-07-29 18:35:03 字數 2756 閱讀 8192

首先,明白複製的原則:

然後,明白copymutablecopy的原則

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