什么是内存管理?
内存管理的是堆空间,内存管理的任务:保证开辟的空间能够被正确释放。
内存管理存在的问题??
【内存泄露】开辟的空间未释放。
【提前释放】堆空间没有使用完毕,就已经释放了。
【重复释放】开辟同一个空间,被释放多次。
【注】内存泄露和提前释放短时间内不会造成系统崩溃,但是重复释放直接造成系统崩溃。
C语言中内存管理的困境?
必须清楚一块堆空间,到底有几个指针指向,在通过其中一个指针free该空间时,必须保证所有的指针必须使用完毕了,避免【提前释放】。而且必须保证只能这些指针中的一个指针去释放该空间。否则会造成【重复释放】。
多模块化操作,需要确定所有的使用该堆空间的模块,都是用完毕。需要商量到底在哪个模块中释放。
3、在多线程操作中,无法确定那个线程最后结束,自然无法确定在那个线程中释放该空间了。
面对以上困境有什么更好地解决方法?
给每个空调间添加一个计时器,多一个指针指向计数器加1,少一个指针指向计数器减1,只要保证计数器与指针指向一致即可。
【手动内存管理MRC】
- (id)retain;计数器加1 ;
- (oneway void)release计数器减1 ;
- (id)autorelease 自动释放池。
- (NSUInteager)retainCount 获取对象引用计数。
OC中的内存管理做了什么事情?
oc中内存管理保证引用与引用计数一致,当多个引用指向该对象时,对象的retainCount加1,当少一个引用指向该对象时,对象的retainCount减1,如果retainCount为1 ,此时再去release,直接释放对象。
3、黄金法则
凡是alloc、new、copy、mutablecopy、(以及new、copy、mutablecopy开头的),方法创建的对象都需要使用release与autorelease释放。
谁创建谁释放,哪个类创建,哪个类释放。
4、注意事项
(1)对象成员变量,在构造函数中创建,在析构函数中释放。
(2)发生指针转移时,先release掉旧值,再retain新值,在赋值。
(3)使用类方法创建对象在长期使用时,需要retain一下
【MRC】
assign|retain|copy 默认是assign
对象 retain
基本数据:assign
字符串 copy
【ARC】
对象 strong\retain
基本数据 assign
字符串 copy
【深拷贝】拷贝内容,生成新对
【浅拷贝】拷贝