欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

string的property解释

程序员文章站 2022-03-07 18:03:55
...

string的修饰符为什么是copy?

@property(copy,nonatomic)NSString *name;

copy的内部实现代码

- (void)setName:(NSString *)newName{
        if (name != newName){
               [name release];
                name = [newName copy];
          }
}

实际项目开发中的影响,下面举例说明一下

修改property修饰符为strong
@property(strong,nonatomic)NSString *name;
NSMutableString *nameStr = [[NSMutableString alloc]initWithString:@"Jack"];
    
    self.name = nameStr;
    
    NSLog(@"1  %@",self.name);
    
    [nameStr appendString:@"lilei"];

    NSLog(@"1  %@",self.name);

打印结果

2018-03-13 23:48:04.040 Test[1315:118740] 1  Jack
2018-03-13 23:48:53.639 Test[1315:118740] 1  Jacklilei

为什么是copy的时候,self.name就不会改变了呢,因为执行self.name = nameStr;相当于调用了copy方法,也就是mutablestring的copy方法,复制那一个set时刻的string内容,以至于之后修改了mutablestring,self.name依然不变,当然,如何重新调用self.name = nameStr,self.name值发生变化,这是预期设定了
看到这里,肯定会有一个问题,为什么拿mutablestring举例子来解释copy,当修饰符是strong的时候,string就不可以?
假设
修改property修饰符为strong


@property(strong,nonatomic)NSString *name;

执行代码


NSString *nameStr = @"Jack";
    
    self.name = nameStr;
    
    NSLog(@"1  %@",self.name);
    
    nameStr = @"lilei";

    NSLog(@"1  %@",self.name);

两次输出的结果都是Jack,内存开辟@"Jack"时候给了nameStr,然后self.name指向了Jack地址,当申请@"lilei"时候,是nameStr指向了新的地址"lilei",然而self.name依然指向的是"Jack",虽然曾经self.name = nameStr;但是告诉我们的一个事实是,self.name并不会根据nameStr的指向改变指向而指向新的"lilei",只有当再次执行self.name = nameStr;self.name的值会改变。我们关注的是代码执行完了之后产生的结果是什么,是self.name指向了一块内存,而不是关注self.name=nameStr,当这块代码执行完后,即是过去式

这里可以看出,string和mutablestring分配出来的内存区别,string是不变的,即是string赋值新的值,但是并不是改变了原来的内存中里面的值,而是重新分配新的内存,存放新的值,然后给string