NSString的属性用什么修饰?copy?strong?
2023-04-24 本文已影响0人
一个半吊子工程师
在写Model数据模型的时候,往往会遇到以下这个问题
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, copy) NSString *name2;
@end
那么究竟是用copy还是strong呢?
下面我们来看看
分别对copy和strong修饰的不可变字符串(NSString)地址以及赋值做出对比
Person *person = [[Person alloc]init];
NSString *tempName = @"hello";
NSLog(@"--------tempName:%p - %@", tempName,tempName);
person.name = tempName;
person.name2 = tempName;
NSLog(@"copy Person.name:%p - %@", person.name,person.name);
NSLog(@"strong Person.name2:%p - %@", person.name2,person.name2);
tempName = @"xxxx";
NSLog(@"copy Person.name:%p - %@", person.name,person.name);
NSLog(@"strong Person.name2:%p - %@", person.name2,person.name2);
image.png
我们通过log得出两者并没有区别
如果改成可变字符串(NSMutableString)会怎么样呢?
NSMutableString *tempName = [[NSMutableString alloc]initWithString:@"zhang"];
NSLog(@"1 tempName == %@ - %p",tempName,tempName);
Person *person = [[Person alloc]init];
person.name = tempName;
person.name2 = tempName;
NSLog(@"copy person.name == %@ - %p",person.name,person.name);
NSLog(@"strong person.name2 == %@ - %p",person.name2,person.name2);
image.png
你会发现,name在strong修饰下同tempName指向的是同一块地址,
而name2在copy修饰下则是指向的一块新的地址。
那是因为在把tempName赋值给copy修饰的name2时,自动进行了深拷贝,把tempName的内容复制了一份,并新开了一块内存来存储,然后让copy修饰的name2指向了这个新的地址。
如果对mutableName进行改变呢?
NSMutableString *tempName = [[NSMutableString alloc]initWithString:@"zhang"];
NSLog(@"tempName == %@ - %p",tempName,tempName);
Person *person = [[Person alloc]init];
person.name = tempName;
person.name2 = tempName;
NSLog(@"strong person.name == %@ - %p",person.name,person.name);
NSLog(@"copy person.name2 == %@ - %p",person.name2,person.name2);
NSLog(@"====================");
[tempName appendString:@" san"];
NSLog(@"tempName == %@ - %p",tempName,tempName);
NSLog(@"strong person.name == %@ - %p",person.name,person.name);
NSLog(@"copy person.name2 == %@ - %p",person.name2,person.name2);
image.png
你会发现,name在
strong修饰下的值也被改变了,但name2在copy修饰下并没改变。这就是为什么要使用copy的原因了。
那么怎么在用strong修饰字符串,不用copy修饰,又不想遇到上面那样被改变值的情况呢
答案是调用copy方法
如:
NSMutableString *tempName = [[NSMutableString alloc]initWithString:@"zhang"];
NSLog(@"tempName == %@ - %p",tempName,tempName);
Person *person = [[Person alloc]init];
person.name = [tempName copy];
person.name2 = tempName;
NSLog(@"strong person.name == %@ - %p",person.name,person.name);
NSLog(@"copy person.name2 == %@ - %p",person.name2,person.name2);
NSLog(@"====================");
[tempName appendString:@" san"];
NSLog(@"tempName == %@ - %p",tempName,tempName);
NSLog(@"strong person.name == %@ - %p",person.name,person.name);
NSLog(@"copy person.name2 == %@ - %p",person.name2,person.name2);
image.png
结论
strong修饰
在把一个可变字符串在未使用copy方法赋值给不可变字符串对象时,修改可变字符串,不可变字符串也会被动进行修改的情况发生。