怎麼用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]];