iOS 深拷贝和浅拷贝的问题总结

深拷贝拷贝的是内容(源对象引用计数不变),浅拷贝拷贝的是指针(源对象引用计数加1)

总结来说就是只有不可变对象调用copy为浅拷贝,其它都是深拷贝。

alloc 是创建变量(此时分配内存)
init 是初始化变量
dealloc 是释放变量
retain 是引用计数加1
release 是引用计数减1

栈对象分配的内存固定且不可修改
堆对象分配的内存可变

栈对象是直接创建“NSString * str1=@“welcome”;
堆对象需要先分配再初始化“ NSMutableString * mstr1=[[NSMutableString alloc] initWithString:@“welcome”];

再补充一点,这里说的是操作系统的堆和栈。
在我们学习“数据结构”时,接触到的堆和栈的概念和这个操作系统中的堆和栈不是一回事的。
操作系统的堆和栈是指对内存进行操作和管理的一些方式。
“数据结构“的堆实际上指的就是(满足堆性质的)优先Queue 的一种数据结构,第1 个元素有最高的优先权;栈实际上就是满足先进后出的性质的数据或数据结构。

- 堆和栈的概念区别

堆: 是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。堆里面一般 放的是静态数据,比如static的数据和字符串常量等,资源加载后一般也放在堆里面。一个进程的所有线程共有这些堆 ,所以对堆的操作要考虑同步和互斥的问题。程序里面编译后的数据段都是堆的一部分。
栈: 是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此 ,栈是 thread safe的。每个c++对象的数据成员也存在在栈中,每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是 切换ss/esp寄存器。栈空间不需要在高级语言里面显式的分配和释放。

猜你喜欢

转载自blog.csdn.net/weixin_39487291/article/details/88548552