copy理解

copy/mutableCopy

因为:

copy执行后得到的结果永远是不可变对象。

mutableCopy执行后得到的结果永远是可变对象。

所以:

不可变对象copy是浅拷贝 只拷贝指针,可变对象copy是深拷贝 拷贝数据

不可变对象或可变对象mutableCopy是深拷贝 拷贝数据


NSString *string = @"11111";

NSString *copyString = [string copy];

NSMutableString *mutableCopyString = [string mutableCopy];

[mutableCopyString appendString:@"aaa"];

NSLog(@"\n%@\n%@",copyString,mutableCopyString);

NSLog(@"\nstring = %p copyString = %p mutableCopyString = %p", string, copyString, mutableCopyString);

copy理解_第1张图片
屏幕快照 2017-11-17 下午12.26.31.png
  • 非系统数据类型对象拷贝需要实现copyWithZone或mutableCopyWithZone方法

否则会崩溃

而且都是深拷贝 重新开辟空间 拷贝数据

XXModel *model = [[XXModel alloc] init];

model.id = 1;

XXModel *copyM = [model copy]; // 崩溃

//崩溃信息: -[XXModel copyWithZone:]:  unrecognized selector sent to instance

解决:

#import "XXModel.h"

@interface XXModel() 

@end

@implementation XXModel

- (id)copyWithZone:(NSZone *)zone

{

    XXModel *model = [[XXModel allocWithZone:zone] init];

    model.id = self.id;

    return model;

}

@end
  • @property (nonatomic, copy) NSString *name;

因为

copy执行后得到的结果永远是不可变对象。

mutableCopy执行后得到的结果永远是可变对象。

所以

copy修饰属性后,属性赋值不可变数据则相当于复制指针,属性赋值可变数据相当于复制数据,类似[name copy];


NSMutableString *string = [NSMutableString stringWithFormat:@"222"];

XXModel *model = [[XXModel alloc] init];

model.name = string;

// 不能改变model.name的值,因为其内部copy新的对象

[string appendString:@" 333"];

NSLog(@"name = %@", model.name);

//输出: name = 222

你可能感兴趣的:(copy理解)