生活随笔
收集整理的這篇文章主要介紹了
copy和mutablecpy区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
和唐討論心得
?
我剛才能用copy解決 是因為? 對于系統的非容器類對象,如果對一不可變對象復制,copy是指針復制(淺拷貝)和mutableCopy就是對象復制(深拷貝)。如果是對可變對象復制,都是深拷貝,但是copy返回的對象是不可變的,如果對返回的對象進行可變操作是非法的。(該結論對系統的容器類對象也是成立的,如NSArray, NSString)
?
?Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with appendString:'
我是用NSMutbleString測試的
使用copy后? 復制過來的對象變成不可變了
?
容器的mutablecopy也只是對容器的入口進行復制,多了個入口,其中的對象并沒有復制新的一份。經過測試發現不管是copy還是mutablecopy對于容器里面的內容并沒有進行深層的復制。如果改變容器中某個對象的值會發現影響著原始對象的值。
?
update-1.2
唐說這樣的話很容易使用混淆,于是決定使用一個類別來解決此問題
類別請看附件
如何實現自定義對象的(非容器類)深層復制
(arc下)
?
//?//??TestClass.m?//??Test?//?//??Created?by?lee?on?13-5-2.?//??Copyright?(c)?2013年?com.DT.organisation.?All?rights?reserved.?//??#import?"TestClass.h"?#import?<objc/runtime.h>???@implementation?TestClass??-(id)copyWithZone:(NSZone?*)zone?{?????id?newModel?=?[[[self?class]?alloc]?init];??????????int?i;?????unsigned?int?propertyCount?=?0;?????objc_property_t?*propertyList?=?class_copyPropertyList([self?class],?&propertyCount);??????????for?(?i=0;?i?<?propertyCount;?i++?)?{?????????objc_property_t?*thisProperty?=?propertyList?+?i;?????????const?char*?propertyName?=?property_getName(*thisProperty);?????????//NSLog(@"FileModel?has?a?property:?'%s'",?propertyName);?????????NSString*?strKey?=?[NSString?stringWithFormat:@"%s",propertyName];?????????id?value?=?[self?valueForKey:strKey];?????????[newModel?setValue:value?forKey:strKey];?????}?????return?newModel;?}?@end? ?
結果如下圖:
?
?
轉載于:https://blog.51cto.com/derkin2jessie/1191470
總結
以上是生活随笔為你收集整理的copy和mutablecpy区别的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。