码迷,mamicode.com
首页 > 移动开发 > 详细

iOS之“内存管理”篇

时间:2015-11-19 01:54:25      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

    什么是内存管理?

 内存管理的是堆空间,内存管理的任务:保证开辟的空间能够被正确释放。

    内存管理存在的问题??

 【内存泄露】开辟的空间未释放。

 【提前释放】堆空间没有使用完毕,就已经释放了。

 【重复释放】开辟同一个空间,被释放多次。

【注】内存泄露和提前释放短时间内不会造成系统崩溃,但是重复释放直接造成系统崩溃。

 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

【深拷贝】拷贝内容,生成新对

【浅拷贝】拷贝

iOS之“内存管理”篇

标签:

原文地址:http://www.cnblogs.com/Jackyxiang/p/4976397.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!