和唐讨论心得
我刚才能用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
结果如下图: