美文网首页
NSString的属性用什么修饰?copy?strong?

NSString的属性用什么修饰?copy?strong?

作者: 一个半吊子工程师 | 来源:发表于2023-04-24 14:21 被阅读0次

在写Model数据模型的时候,往往会遇到以下这个问题

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, copy) NSString *name2;
@end

那么究竟是用copy还是strong呢?

下面我们来看看

分别对copystrong修饰的不可变字符串(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方法赋值给不可变字符串对象时,修改可变字符串不可变字符串也会被动进行修改的情况发生。

相关文章

网友评论

      本文标题:NSString的属性用什么修饰?copy?strong?

      本文链接:https://www.haomeiwen.com/subject/ncuujdtx.html