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;
}
輸出結(jié)果:
www.google.com plus, 0x100406aa0
www.google.com plus, 0x100406aa0
如果把weak或strong改為copy,由淺復(fù)制變成深復(fù)制
@property (nonatomic,weak) NSString *name;
@property (nonatomic,copy) NSString *name;
輸出結(jié)果:
www.google.com, 0x7fff79f8d3c0
www.google.com plus, 0x100406aa0
針對(duì)指針型對(duì)象的拷貝虾攻,有淺復(fù)制和深復(fù)制兩種芍殖。
淺復(fù)制:將原始對(duì)象的指針值復(fù)制到副本中熄驼,即指針拷貝郭蕉,原始對(duì)象和副本共享引用的數(shù)據(jù);相當(dāng)于創(chuàng)建了一個(gè)文件的快捷方式丁鹉。
深復(fù)制:復(fù)制原始對(duì)象指針?biāo)玫臄?shù)據(jù)妒潭,并將其賦給副本對(duì)象,即內(nèi)容拷貝揣钦,相當(dāng)于創(chuàng)建了一份新的文件雳灾。
例如,當(dāng)我們?yōu)橐粋€(gè)類的屬性添加copy關(guān)鍵字時(shí)冯凹,那么對(duì)這個(gè)屬性賦值時(shí)(即:調(diào)用setter方法)谎亩,就會(huì)執(zhí)行深拷貝操作。當(dāng)我們把屬性關(guān)鍵字改為strong或者weak時(shí)宇姚,那么對(duì)這個(gè)屬性賦值時(shí)匈庭,就會(huì)執(zhí)行淺拷貝(只拷貝指針地址)。
NSString *string = @"test";
NSString *string1 = [string copy];
NSString *string2 = [string mutableCopy];
copy->復(fù)制指針(創(chuàng)建一個(gè)指針指向原始的內(nèi)存地址)
mutableCopy->復(fù)制指針及內(nèi)容(創(chuàng)建新的內(nèi)存地址)
string:[0x100001058]test
string1:[0x100001058]test
string2:[0x100201600]test