Copy相關

怎麼用copy關鍵字?

1、NSString、NSArray,NSDictionary等經常使用copy關鍵字,是因爲它們有可變類型

2、block也經常使用,因爲在MRC中,方法內部的block是在棧區的,使用copy可以把它放在堆區,在ARC中寫不寫都行,對block使用strong和copy都是一樣的,但是使用copy更好。

 

深拷貝和淺拷貝

淺拷貝就是拷貝指針,深拷貝是拷貝內容

集合的淺拷貝

     進行淺拷貝,會向原始的集合發送retain消息,引用計數+1,所以copy後的指針的地址等於原來的那個集合的地址

集合的深拷貝

     只是單層的深拷貝,內部的元素還是指針拷貝      

不論是對集合還是非集合都適用

  • [immutableObject copy] // 淺複製
  • [immutableObject mutableCopy] //深複製
  • [mutableObject copy] //深複製
  • [mutableObject mutableCopy] //深複製

集合的深拷貝

兩種方法:

1、用 initWithArray:copyItems: 將第二個參數設置爲YES即可深複製

NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];

用這種方法深複製,集合裏的每個對象都會收到 copyWithZone: 消息。如果集合裏的對象遵循 NSCopying 協議,那麼對象就會被深複製到新的集合。如果對象沒有遵循 NSCopying 協議,而嘗試用這種方法進行深複製,會在運行時出錯。copyWithZone: 這種拷貝方式只能夠提供一層內存拷貝(one-level-deep copy),而非真正的深複製。

2、將集合進行歸檔(archive),然後解檔(unarchive),真正意義的深複製

NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章