《Objective-c》Foundation框架 -(copy/mutableCopy)

 

1.copy(不可變副本)/mutableCopy(可變副本):

  • copy語法的目的:改變副本的時候,不會影響到源對象;

  • 一個對象能夠使用copy/mutableCopy方法建立副本

  • copy須要先實現NSCopying協議,建立的是不可變副本

  • mutableCopy須要先實現NSMutableCopying協議,建立的時不可變副本

  • 深拷貝:內容(對象)的拷貝,源對象和副本指向的是不一樣的對象。源對象的引用計數器不變新對象的引用計數器設置爲1

  • 淺拷貝:指針的拷貝,源對象和副本指向的時同一個對象。對象的引用計數器+1;至關於作了一次retain操做;

  • 只有不可變對象建立不可變副本(copy)纔是前拷貝,其餘的都是深拷貝;

  • NSString/NSMutableStringNSDictionary/NSMutableDictionaryNSArray/NSMutableArray等都已經實現了NSCopying協議NSMutableCopying協議,因此在使用copy或者mutableCopy建立副本是不用再實現NSCopying協議或者NSMutableCopying協議

2.淺拷貝(指針拷貝):

  • 淺拷貝:指針拷貝,不會產生新對象。源對象的計數器+1,至關於作了一次retain操做;

  • 只有一種狀況是淺拷貝,不可變對象調用對象方法時;

  • 淺拷貝爲指針的拷貝

3.深拷貝(內容拷貝):

  • 深拷貝:內容(對象)拷貝,會產生新對象。新對象的計數器置1,源對象的計數器不變;

  • 深拷貝一:NSString NSMutableCopy

  • 深拷貝二:NSMutableString  copy

         

  • 深拷貝三:NSMutableString  NSMutableCopy

          

3.自定義類以及子類的拷貝:

  • 自定義的類若是想使用copy或者mutableCopy必需要先實現NSCopying協議或者NSMutableCopying協議!否則會報錯「[Student copyWithZone:]: unrecognized selector sent to instance 0x1030051a0

  • NSCopying協議或者NSMutableCopying協議中都各有一個方法:因此咱們應該從新實現其方法!

            

  • - (id)copyWithZone:(NSZone *)zone方法的重寫:

  • 因爲子類中還有其餘的屬性(age),因此還要將age屬性拷貝給副本,因此還要在子類中重寫- (id)copyWithZone:(NSZone *)zone方法

 

  • 使用靜態方法快速建立對象時的注意點:

相關文章
相關標籤/搜索