浅拷贝 & 深拷贝
copy 就是浅拷贝, 因为没有产生新的对象(有没有产生新的对象也是判断深浅拷贝的标准)
mutableCopy 就是深拷贝, 会再内存中重新分配一块内存空间.
#import "Person.h"
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
Person * p = [[Person alloc] init];
NSMutableString * name = [NSMutableString stringWithFormat:@"%@", @"zhangsan"];
// p.name NSString 接收 name NSMutableString 没有警告??
p.name = name; // 因为是strong 所以p.name 指针指向 name 堆空间.
// 如果是copy , p.name 指向重新开辟一个空间(不可变副本, 如NSString, 不是NSMutableString) 存放 name 再指向此地址.
NSLog(@"%@", p.name);
[name replaceCharactersInRange:NSMakeRange(0, 5) withString:@"li"];
p.name = @"wuliao";
NSLog(@"%@", p.name);
//************************ stone ***
NSString * str = @"hello world";
id str1 = [str copy]; // __NSCFConstantString , CF = core foundation
id str2 = [str mutableCopy]; // __NSCFString
NSLog(@"%@", NSStringFromClass([str1 class])); // __NSCFConstantString 不可变
NSLog(@"%@", NSStringFromClass([str2 class])); // __NSCFString 可变
// 能调用 appendString 表示 是NSMutableString
[str2 appendString:@"xxx"]; // hello worldxxx
NSLog(@"%@", str2);
NSLog(@"%@", NSStringFromClass([str2 class])); // __NSCFString
NSLog(@"%@",@"===============");//************************ stone ***
NSMutableString * s = [NSMutableString stringWithFormat:@"%@",@"woshishui"];
id s1 = [s copy]; //NSTaggedPointerString
id s2 = [s mutableCopy]; //__NSCFString
[s2 appendString:@"jjj"];
NSLog(@"s2 = %@",s2); // s2 = woshishuijjj
NSLog(@"%@", NSStringFromClass([s1 class])); // NSTaggedPointerString 不可变 | 在OS X 10.10中,NSString就采用了这项技术 | 有待研究...
NSLog(@"%@", NSStringFromClass([s2 class])); // __NSCFString 可变
NSLog(@"%@",@"===============");//************************ stone ***
NSMutableString * mts = [NSMutableString stringWithFormat:@"%@",@"mama"];
NSString * string = @"baba";
NSLog(@"mts = %p",mts);
NSLog(@"string = %p",string);
string = mts; // 多态吗? 父类指针 指向 子类空间
NSLog(@"string = %p",string);
NSLog(@"%@",NSStringFromClass([string class])); // __NSCFString 即便是可变空间, 用NSString接收的, 依然没有 appendString 方法...
}
return 0;
}