Objective C中的物件複製

2021-06-26 22:08:17 字數 2746 閱讀 5739

基本資料型別之間變數的複製是值傳遞,而引用型別之間物件的賦值是引用傳遞。這樣如果乙個物件賦值給另乙個物件,當其中乙個物件的屬性被修改時,另外乙個物件的屬性也同時被修改。

定義乙個person物件,有兩個屬性name和age。假設per1物件的位址是0x123,將per1賦值給per2,是將per1的位址賦值給per2,所以per1和per2的位址相同,他們指向同乙個物件。這樣當第乙個物件的屬性改變是,第二個物件也會跟著改變。為了使第乙個物件的改變不會影響到第二個物件,我們需要複製物件。

//測試賦值

- (void)testassign

程式的輸出結果如下:

2014-11-09 19:41:56.887 deepcopy[842:93206] per1's name = big tom, age = 21

2014-11-09 19:41:56.888 deepcopy[842:93206] per2's name = big tom, age = 21

這個問題同樣出現在集合陣列中,我們將乙個陣列賦值給另外乙個陣列,當刪除乙個陣列的乙個元素時,第二個陣列中的元素也將被刪除。

//測試賦值2

- (void)testassign2

nslog(@"%@", @"-----------------------");

//遍歷第二個陣列

for (nsstring *item in array2)

}

程式的輸出結果如下:

2014-11-09 19:49:53.932 deepcopy[874:96111] 2

2014-11-09 19:49:53.932 deepcopy[874:96111] 3

2014-11-09 19:49:53.933 deepcopy[874:96111] -----------------------

2014-11-09 19:49:53.933 deepcopy[874:96111] 2

2014-11-09 19:49:53.933 deepcopy[874:96111] 3

物件的淺複製和深複製

為避免上述出現的問題,可以複製物件。nsobject提供了兩個方法:-(id)copy 和 -(id)mutablecopy,其中copy方法可以拷貝乙個不可變物件,而mutablecopy方法可以拷貝乙個可變物件,例如nsmutablearray,nsmutableset等。

下面給出乙個nsmutablearray,使用mutablecopy方法拷貝乙個物件複製給乙個新物件,這樣當從第乙個陣列中刪除乙個元素時,第二個陣列並沒有發生改變。

//測試拷貝

- (void)testcopy

nslog(@"%@", @"-----------------------");

//遍歷第二個陣列

for (nsstring *item in array2)

}

程式的輸出結果如下:

2014-11-09 20:01:20.008 deepcopy[931:100350] 1

2014-11-09 20:01:20.008 deepcopy[931:100350] 2

2014-11-09 20:01:20.008 deepcopy[931:100350] 3

2014-11-09 20:01:20.008 deepcopy[931:100350] -----------------------

2014-11-09 20:01:20.009 deepcopy[931:100350] 2

2014-11-09 20:01:20.009 deepcopy[931:100350] 3

物件複製分為深複製和淺複製,淺複製只複製物件本身,物件包含或關聯的物件並不複製,而深複製不光複製物件本身,物件包含或關聯的物件也將被同時複製。

下面定義乙個可變陣列,可變陣列中新增若干可變字串。如果進行淺複製,陣列中的元素將會受到影響,如果進行深複製,陣列的元素將不會受到影響。

//測試拷貝

- (void)testcopy2

//改變第乙個陣列中的元素

nsmutablestring *str = [array1 objectatindex:0];

//遍歷第乙個陣列

for (nsstring *item in array1)

nslog(@"%@", @"-----------------------");

//遍歷第二個陣列

for (nsstring *item in array2)

}

程式執行結果如下:

2014-11-09 20:44:44.775 deepcopy[972:106532] 1changed

2014-11-09 20:44:44.775 deepcopy[972:106532] 2

2014-11-09 20:44:44.775 deepcopy[972:106532] 3

2014-11-09 20:44:44.775 deepcopy[972:106532] -----------------------

2014-11-09 20:44:44.775 deepcopy[972:106532] 1

2014-11-09 20:44:44.775 deepcopy[972:106532] 2

2014-11-09 20:44:44.776 deepcopy[972:106532] 3

Objective C 中的類和物件

在objc4 532.2以後,蘋果把nsobject的實現也挪進來了。想要了解nsobject底層實現終於不用去摳gnustep了 好了,下面正文 runtime裡面,宣告了id和class的型別,簡化一下如下 1 2 3 4 5 6 7 8 9 structobjc class structobj...

objective c物件導向

oop object oriented programming 特徵 多型 繼承 封裝 兩部分組成 1.inte ce部分 定義類的公共介面和類的資料成員 2.implementation部分 實現這些方法的實際方法 main檔案中新增friend類 inte ce 部分 inte ce frien...

Objective C之類和物件

面向過程程式設計 procedure oriented programming,pop 以事件為中心,關心完成該事件的詳細步驟,一步一步如何實現.物件導向程式設計 object oriented programming,oop 以事物為中心,也就是引數事件的參與者,設計事物的功能,而完成事件只是事物...