ClassA.h
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@property (nonatomic,weak) NSString *name;
@end
main.m
#import <Foundation/Foundation.h>
#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