IOS中栈的空间只有1M,堆的空间是内存空间+硬盘空间。所以基本的数据类型都是放在栈中,而有alloc的,都是在堆中实现的。
深复制:内容复制一份 创建一个新的地址空间(堆中)引用计数设置为1
浅复制:内容复制一份 地址空间相同 引用计数+1
下面总结一些:
如果对象是不可变的,如NSString NSArray等,只要调用copy都是浅复制,调用mutable copy是深复制。
如果对象是可变的,如NSMutableString NSMutableArray等,copy、mutable copy都是深复制。
下面给出集中情况的测试代码:
//不可变到可变
void NS2MU()
{
NSString *str = @"hello";
NSMutableString *mstr = [str copy];
NSMutableString *mstr1 = [str mutableCopy];
//[mstr appendString:@"123"]; 崩溃
[mstr1 appendString:@"123"];
NSLog(@"%@ %@ %@", str, mstr, mstr1);
NSLog(@"%p %p %p", str, mstr, mstr1);
NSString *nstr = [str copy];
NSString *nstr1 = [str mutableCopy];
NSLog(@"%@ %@ %@", str, nstr, nstr1);