copy和mutableCopy
- 拷贝的目的:产生一个副本对象,跟源对象互不影响
- 修改了源对象,不会影响副本对象
- 修改了副本对象,不会影响源对象
- NSString、NSArray、NSDictionary自带拷贝功能。
- iOS提供了2个拷贝方法
- 1.copy,不可变拷贝,产生不可变副本
- 2.mutableCopy,可变拷贝,产生可变副本
- 深拷贝和浅拷贝
- 1.深拷贝:内容拷贝,产生新的对象
- 2.浅拷贝:指针拷贝,没有产生新的对象
- 不可变字符串使用了不可变拷贝,因为内容不可变,不存在可变的操作,就直接指针拷贝,没有产生新的对象。

- 可变内容使用不可变拷贝,不可变内容使用可变拷贝,是内容拷贝,产生新的对象。

- 思考问题 下面这段代码是否有问题
@property (copy, nonatomic) NSMutableArray *data
MJPerson *p = [[MJPerson alloc] init]
p.data = [NSMutableArray array]
[p.data addObject:@"jack"]
[p.data addObject:@"rose"]
[p release]
- 答案是有问题的 说没有这个add方法

- copy方法的本质是这个老的计数-1,新计数+1。可变内容使用了不可变拷贝,生成了一个新的不可变对象,成了NSArray,所以没有这个方法

- mutableCopy策略是没有的。所以还是用strong吧。

自定义copy
- 需求
- 1.有个数据模型,里面有很多已经完成了赋值,跳转到下一个页面,处理数据后返回,我要的是里面某一些值得差值。就可以考虑自定义copy
- 遵守协议
- 重写 copyWithZone 方法
#import <Foundation/Foundation.h>
@interface MJPerson : NSObject <NSCopying>
@property (assign, nonatomic) int age;
@property (assign, nonatomic) double weight;
@end
#import "MJPerson.h"
@implementation MJPerson
- (id)copyWithZone:(NSZone *)zone
{
MJPerson *person = [[MJPerson allocWithZone:zone] init];
person.age = self.age;
return person;
}
- (NSString *)description
{
return [NSString stringWithFormat:@"age = %d, weight = %f", self.age, self.weight];
}
@end
MJPerson *p1 = [[MJPerson alloc] init];
p1.age = 20;
p1.weight = 50;
MJPerson *p2 = [p1 copy];
NSLog(@"%@", p1);
NSLog(@"%@", p2);