美文网首页
string的property解释

string的property解释

作者: TimMei3345 | 来源:发表于2018-03-14 00:13 被阅读0次

    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

    相关文章

      网友评论

          本文标题:string的property解释

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