ios的Copy与MutableCopy

787 阅读2分钟

copy和mutableCopy

  • 拷贝的目的:产生一个副本对象,跟源对象互不影响
    • 修改了源对象,不会影响副本对象
    • 修改了副本对象,不会影响源对象
    • NSString、NSArray、NSDictionary自带拷贝功能。
  • iOS提供了2个拷贝方法
    • 1.copy,不可变拷贝,产生不可变副本
    • 2.mutableCopy,可变拷贝,产生可变副本
  • 深拷贝和浅拷贝
    • 1.深拷贝:内容拷贝,产生新的对象
    • 2.浅拷贝:指针拷贝,没有产生新的对象
  • 不可变字符串使用了不可变拷贝,因为内容不可变,不存在可变的操作,就直接指针拷贝,没有产生新的对象。 image.png
  • 可变内容使用不可变拷贝,不可变内容使用可变拷贝,是内容拷贝,产生新的对象。 image.png image.png
  • 思考问题 下面这段代码是否有问题
@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方法 image.png
  • copy方法的本质是这个老的计数-1,新计数+1。可变内容使用了不可变拷贝,生成了一个新的不可变对象,成了NSArray,所以没有这个方法 image.png
  • mutableCopy策略是没有的。所以还是用strong吧。 image.png

自定义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;
//    person.weight = self.weight;
    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];
//        p2.age = 30;

        NSLog(@"%@", p1);
        NSLog(@"%@", p2);