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