Copy

2018-09-17  本文已影响12人  曹来东

拷贝

产生一个副本对象,和原对象互不影响,修改了任意对象,不会影响另一个对象.

copy和mutableCopy

深拷贝 浅拷贝

//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操作

@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);
    }
上一篇 下一篇

猜你喜欢

热点阅读