Objective-C复制解析
生活随笔
收集整理的這篇文章主要介紹了
Objective-C复制解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、為什么使用復制?
1.C語言以及Objective-C語言總是按值傳遞的,按值傳遞意味著是隱式復制。在這里就分為兩種情況:? ?(1)如果是非對象類型,對傳遞過來的值進行更改,只會更改副本,對原始值沒有影響,比如:int a = 3; int b; b = a, b = 4; 現在b的值是4,但是a的值仍然是3。? ?(2)如果是對象類型,則就不一樣了。Objective-C對象總是作為指針傳遞的,而且指針本身是隱式復制的,不會復制指針對應的對象,此時沒有副本。當對傳遞過來的指針進行更改操作時,操作的還是原始對象。
2.假如說我們需要傳遞一個指針給一個對象,但是希望確保原始對象不會更改,這時候就用到了復制。復制操作將創建一個原始對象的副本,并且將副本的指針返回,這樣兩個指針將指向不同的對象,原始對象的值將不會再受影響。
二、NSCopying協議和NSMutableCopying協議
1.NSObject類的實例方法:copy和mutableCopy,對應對象類型的復制操作。但是如果一個對象要想支持copy方法,需要實現NSCopying協議并實現copyWithZone:方法,mutableCopy方法對應NSMutableCopying協議和mutableCopyWithZone:方法。
2.當對一個支持NSCopying協議的類調用copy方法時,NSObject默認會調用copyWithZone:方法,并將返回值返回給copy方法。假如對一個沒有實現NSCopying協議的對象調用copy方法時,將會發生異常。NSMutableCopying協議同理。
3.copy方法,得到的是不可變的對象,不管之前是不是。? ?mutableCopy方法,得到的是可變的對象,不管之前是不是。
4.在Property中,如果使用了readonly和copy,則在set和get方法中,復制的時候使用的是copy方法,即返回的對象是只讀的,如果使用readwrite,使用的則是mutableCopy方法。
三、深復制與淺復制:
1.淺復制:僅僅復制所考慮的對象,而不復制它引用的對象;? ?深復制:把復制的對象和對象所引用的對象都復制一遍,并且盡可能進行深層的復制。
2.支持復制的cocoa類全部實現了復制模式,并且返回一個淺復制的副本。
3.用于不可變的類的copyWithZone:方法的實現,根本不需要創建副本。它足以返回一個指向對象的原始指針,因為在返回對象之后沒有更改它的風險。函數體實現內容很簡單:return [self retain];
4.淺復制實現方法:在協議實現中,首先創建一個新對象,并且將原對象包含的值賦值給新的對象,然后返回新對象。創建新對象要使用allocWithZone:方法。
5.深復制的實現方法:獲得cocoa對象的深復制的一種方便的方式是使用歸檔和解檔模式。當一個對象以及所包含的所有對象都支持NSCoding協議,就可以將一個對象以及包含的對象全部歸檔,然后再以解檔的方式重建對象,從而獲得深復制的對象。
1.C語言以及Objective-C語言總是按值傳遞的,按值傳遞意味著是隱式復制。在這里就分為兩種情況:? ?(1)如果是非對象類型,對傳遞過來的值進行更改,只會更改副本,對原始值沒有影響,比如:int a = 3; int b; b = a, b = 4; 現在b的值是4,但是a的值仍然是3。? ?(2)如果是對象類型,則就不一樣了。Objective-C對象總是作為指針傳遞的,而且指針本身是隱式復制的,不會復制指針對應的對象,此時沒有副本。當對傳遞過來的指針進行更改操作時,操作的還是原始對象。
2.假如說我們需要傳遞一個指針給一個對象,但是希望確保原始對象不會更改,這時候就用到了復制。復制操作將創建一個原始對象的副本,并且將副本的指針返回,這樣兩個指針將指向不同的對象,原始對象的值將不會再受影響。
二、NSCopying協議和NSMutableCopying協議
1.NSObject類的實例方法:copy和mutableCopy,對應對象類型的復制操作。但是如果一個對象要想支持copy方法,需要實現NSCopying協議并實現copyWithZone:方法,mutableCopy方法對應NSMutableCopying協議和mutableCopyWithZone:方法。
2.當對一個支持NSCopying協議的類調用copy方法時,NSObject默認會調用copyWithZone:方法,并將返回值返回給copy方法。假如對一個沒有實現NSCopying協議的對象調用copy方法時,將會發生異常。NSMutableCopying協議同理。
3.copy方法,得到的是不可變的對象,不管之前是不是。? ?mutableCopy方法,得到的是可變的對象,不管之前是不是。
4.在Property中,如果使用了readonly和copy,則在set和get方法中,復制的時候使用的是copy方法,即返回的對象是只讀的,如果使用readwrite,使用的則是mutableCopy方法。
三、深復制與淺復制:
1.淺復制:僅僅復制所考慮的對象,而不復制它引用的對象;? ?深復制:把復制的對象和對象所引用的對象都復制一遍,并且盡可能進行深層的復制。
2.支持復制的cocoa類全部實現了復制模式,并且返回一個淺復制的副本。
3.用于不可變的類的copyWithZone:方法的實現,根本不需要創建副本。它足以返回一個指向對象的原始指針,因為在返回對象之后沒有更改它的風險。函數體實現內容很簡單:return [self retain];
4.淺復制實現方法:在協議實現中,首先創建一個新對象,并且將原對象包含的值賦值給新的對象,然后返回新對象。創建新對象要使用allocWithZone:方法。
5.深復制的實現方法:獲得cocoa對象的深復制的一種方便的方式是使用歸檔和解檔模式。當一個對象以及所包含的所有對象都支持NSCoding協議,就可以將一個對象以及包含的對象全部歸檔,然后再以解檔的方式重建對象,從而獲得深復制的對象。
總結
以上是生活随笔為你收集整理的Objective-C复制解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [记录]---mysql数据库,deci
- 下一篇: [前台]---js重复上传一张图片两次,