拷贝
产生一个副本对象,和原对象互不影响,修改了任意对象,不会影响另一个对象.
copy和mutableCopy
- copy:不可变拷贝,产生不可变副本.
- mutableCopy : 可变拷贝,产生可变副本.
深拷贝 浅拷贝
- 深拷贝:内容拷贝,产生新对象
- 浅拷贝:指针拷贝,不会产生新对象.
image.png
//NSString
NSString * str1 = [NSString stringWithFormat:@"test"];
NSString * str2 = [str1 copy];//返回NSString
NSString * str3 = [str1 mutableCopy];//返回NSMutableString
NSLog(@"%@ %@ %@",str1,str2,str3);
//NSMutableString
NSMutableString * str1 = [NSMutableString stringWithFormat:@"test"];
NSString * str2 = [str1 copy];//copy 就是返回不可变对象
NSMutableString * str3 = [str1 mutableCopy];//mutableCopy 就是返回可变对象
NSLog(@"%@ %@ %@",str1,str2,str3);
字符串的引用计数为-1,说明采用了Tagger Pointer.只需要将字符串写大一些即可
OC对象的copy操作
- 使用
copy
时,不要修饰可变对象.
@property (nonatomic,copy) NSMutableArray * data;
@interface ViewController ()
//copy返回的是一个不可变对象,不可变对象没有addObject方法
@property (nonatomic,copy) NSMutableArray * data;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.data = [NSMutableArray array];
[self.data addObject:@"1"];
[self.data addObject:@"1"];
}
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArray0 addObject:]: unrecognized selector sent to instance 0x60c0000080a0'
自定义Copy
@interface LDPerson : NSObject <NSCopying>
@property (assign, nonatomic) int age;
@property (assign, nonatomic) double weight;
@end
#import "LDPerson.h"
@implementation LDPerson
- (id)copyWithZone:(NSZone *)zone
{
LDPerson *person = [[LDPerson 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
//调用
- (void)viewDidLoad {
[super viewDidLoad];
LDPerson *p1 = [[LDPerson alloc] init];
p1.age = 20;
p1.weight = 50;
LDPerson *p2 = [p1 copy];
p2.age = 30;
NSLog(@"%@", p1);
NSLog(@"%@", p2);
}
网友评论