深复制/浅复制

ClassA.h

#import 
@interface ClassA : NSObject
@property (nonatomic,weak) NSString *name;
@end

main.m

#import 
#import "ClassA.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableString *str = [[NSMutableString alloc]initWithString:@"www.google.com"];
        ClassA *classA = [[ClassA alloc] init];
        classA.name = str;
        [str appendString:@" plus"];
        NSLog(@"%@, %p", classA.name, classA.name);
        NSLog(@"%@, %p", str, str);
    }
    return 0;
}   

输出结果:

www.google.com plus, 0x100406aa0
www.google.com plus, 0x100406aa0

如果把weak或strong改为copy,由浅复制变成深复制

@property (nonatomic,weak) NSString *name;
@property (nonatomic,copy) NSString *name;

输出结果:

www.google.com, 0x7fff79f8d3c0
www.google.com plus, 0x100406aa0

针对指针型对象的拷贝,有浅复制和深复制两种。
浅复制:将原始对象的指针值复制到副本中,即指针拷贝,原始对象和副本共享引用的数据;相当于创建了一个文件的快捷方式。

深复制:复制原始对象指针所引用的数据,并将其赋给副本对象,即内容拷贝,相当于创建了一份新的文件。

例如,当我们为一个类的属性添加copy关键字时,那么对这个属性赋值时(即:调用setter方法),就会执行深拷贝操作。当我们把属性关键字改为strong或者weak时,那么对这个属性赋值时,就会执行浅拷贝(只拷贝指针地址)。

    NSString *string = @"test";
    NSString *string1 = [string copy];
    NSString *string2 = [string mutableCopy];

copy->复制指针(创建一个指针指向原始的内存地址)
mutableCopy->复制指针及内容(创建新的内存地址)

string:[0x100001058]test
string1:[0x100001058]test
string2:[0x100201600]test

你可能感兴趣的:(深复制/浅复制)