NSString *str = @"xxxx";等同于NSString *str =[ [NSString alloc] initWithString:@"xxxx"]; //这句会开辟一块内存来存放@"xxxx“字符串,str指向它;
str = @"newString"; //此句话,会使得原来存放的@"xxxx"的引用计数减一,同时 新开一个内存存放@"newString" ,str指向它。
NSMutableString *mstr = @"xxxx";等同于NSMutableString *mstr =[ [NSMutableString alloc] initWithString:@"xxxx"]; //这句会开辟一块内存来存放@"xxxx“字符串,str指向它;
mstr = @"newString"; //此句话,会使得原来存放的@"xxxx"的内存里面的内容改变为@"newString" ,str指向它。
对于retain,则给变量赋值后指向某块内存后,内存的引用计数加一;
对于copy,给某变量赋值的时候,会将要赋给它的内容复制到新的内存中去,该变量指向新的内存。
所以,
对源头是NSMutableString的字符串,retain仅仅是指针引用,增加了引用计数器,这样源头改变的时候,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的),它也会跟着改变;而copy声明的变量,它不会跟着源头改变,它实际上是深拷贝。对源头是NSString的字符串,无论是retain声明的变量还是copy声明的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝。