和唐讨论心得

 

我刚才能用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下)

 

  1. // 
  2. //  TestClass.m 
  3. //  Test 
  4. // 
  5. //  Created by lee on 13-5-2. 
  6. //  Copyright (c) 2013年 com.DT.organisation. All rights reserved. 
  7. // 
  8.  
  9. #import "TestClass.h" 
  10. #import <objc/runtime.h>  
  11.  
  12. @implementation TestClass 
  13.  
  14. -(id)copyWithZone:(NSZone *)zone 
  15.     id newModel = [[[self class] alloc] init]; 
  16.      
  17.     int i; 
  18.     unsigned int propertyCount = 0; 
  19.     objc_property_t *propertyList = class_copyPropertyList([self class], &propertyCount); 
  20.      
  21.     for ( i=0; i < propertyCount; i++ ) { 
  22.         objc_property_t *thisProperty = propertyList + i; 
  23.         const char* propertyName = property_getName(*thisProperty); 
  24.         //NSLog(@"FileModel has a property: '%s'", propertyName); 
  25.         NSString* strKey = [NSString stringWithFormat:@"%s",propertyName]; 
  26.         id value = [self valueForKey:strKey]; 
  27.         [newModel setValue:value forKey:strKey]; 
  28.     } 
  29.     return newModel; 
  30. @end 

 

结果如下图:

 

copy和mutablecpy区别_mutablecopy