在写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);
![](https://img.haomeiwen.com/i12522170/ae1d070b182d917a.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);
![](https://img.haomeiwen.com/i12522170/ca22e130c4fd01f7.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);
![](https://img.haomeiwen.com/i12522170/0aa47771ce89ae00.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);
![](https://img.haomeiwen.com/i12522170/e2410c0020504113.png)
结论
strong修饰
在把一个可变字符串
在未使用copy方法
赋值给不可变字符串
对象时,修改可变字符串
,不可变字符串
也会被动进行修改
的情况发生。
网友评论