iOS开发内存管理总结

一、retain、copy、assign的区别:
1.retain:当对一个对象A调用retain,然后赋值给B时,对象的引用计数加1,A和B指向同一个内存地址。
2.copy:当对一个对象A调用retain,然后赋值给B时,对象的引用计数加1,而且生成了一个新的拷贝,A和B指向不一样的内存地址。
3.assign:当对一个对象A调用retain,然后赋值给B时,对象的引用计数不变,A和B指向同一个地址。

二、为什么delegate声明要使用assign?
因为如果使用assign的话,对象间会产生循环引用的情况,导致循环引用的对象都不能释放内存。

三、atomic和noatomic的区别
这两个关键字用来决定编译生成的getter和setter方法是否为原子操作,即是否是多线程安全的。
atomic表示是原子操作,支持多线程安全,noatomic是非原子操作,不支持多线程安全。

四、自动释放池
1.自动释放池实现了对象的延迟释放,将释放时机延后。当对一个对象调用autorelease方法后,对象被加入自动释放池。当自动释放池释放时,会对自动释放池中的对象调用release方法。
2.主线程会自动创建自动释放池,自己创建的线程需要自己负责创建自动释放池。在一个RunLoop周期开始时,系统会创建一个自动释放池,当RunLoop周期结束时,系统会释放之前创建的自动释放池。如果我们在使用autorelease时没有自己创建自动释放池,对象会在它所在的RunLoop周期结束时被释放掉。一个UI事件,Timer调用,delegate调用,都会是一个新的Runloop。
3.类似于[NSString stringWithFormat:]这样的类方法创建的对象默认是使用了自动释放池的,不需要释放。
4.当在短时间内大量的使用自动释放对象,要手动使用自动释放池来释放对象,否则内存会在短时间内疯涨。

六、didReceiveMemoryWarning、viewDidUnload和dealloc方法使用
1.didReceiveMemoryWarning方法:
首先调用[super didReceiveMemoryWarning]方法,然后检查当前视图的父视图是否为空,如果为空,则释放掉一些不需要的数据。关于视图界面的释放不应该在这个方法中,应该放在viewDidUnload方法中。
2.viewDidUnload方法:
(1)此方法只在发生内存警告时调用。在这个方法调用之前,控制器的view属性已经被release并且设置为nil。
(2)iOS6之前:当低内存情况发生,而且当前视图不需要显示时,系统会调用此方法来清理额外的视图(但是控制器还存在)。在此方法中我们需要清理输出口,比如清理输出口:self.xxxx = nil;(使用self关键字);以及我们自己通过代码建立的视图界面。我们不应该在此方法中清除数据,尤其是一些不能恢复的数据。可以恢复的数据我们应该在didReceiveMemoryWarning中清除,不能恢复的数据应该在dealloc方法中清除。
(3)iOS6以及之后:当控制器的视图已经没有显示在window上时,系统会自动清空控制器中的所有视图以及输出口,所以不用在发生内存警告时再调用此方法。所以,在iOS6以及以后的版本,这个方法不会再被调用了。
3.dealloc方法:
对象释放时调用,在这个方法中,要释放掉所有的数据和输出口。比如释放输出口:[xxx release];(不使用self关键字)

六、一些注意的地方
1.向集合(NSArray,NSDictionary等)添加对象时,被添加的对象会被执行retain操作,当从集合中移走对象或者集合对象被释放时,集合中的对象会被执行release操作。
2.要保证有多少个alloc、copy、multablecopy、retain消息,就要有多少个release或者autorelease,保证代码平衡。
3.在程序中直接用@""创建的NSString对象,是常量,引用计数是-1,向它发送retain、release没有效果。
4.在View中使用图片时,大的图片区域尽量使用小的图片数据来填充,减小内存占用。
5.[UIImage imageNamed:@""],次方法使用了系统缓存来缓存图像,会长时间占用内存,最好使用imageWithContentsOfFile方法。
6.数据要延迟加载,只在内存中保留满足需要的最少的数据和视图元素,需要的时候再加载,不需要就马上销毁。
7.假如一个成员变量在property中使用了retain,当使用self关键字对其赋值时,会对创建的对象再retain一次,造成内存泄露。比如:self.xxx = [[XXX alloc] init];
  对一个成员变量赋nil值时,self.xxx = nil,会调用xxx的release方法,并且将指针置空,xxx = nil,只是将指针置空。
8.加载本地图片时,尽量不要使用[UIImage imageNamed:@""]这个方法,因为这个方法会使用系统缓存来缓存图像,会占用内存。可以使用[UIImage imageWithContentOfFile:@""]来加载本地图像。
9.在控制器中使用NSTimer会使当前控制器引用计数加1,所以在控制器释放之前,必须暂停和使定时器失效,否则控制器将不会被释放。

七、内存警告(iOS6之前)
1.原理:
当发生内存警告时,系统会对程序内存在的所有的ViewController调用didReceiveMemoryWarning方法,然后,如果当前ViewController没有父视图(即没有显示),viewDidUnload方法会被调用(iOS6及以后不调用)。之后,当ViewController的视图对象,比如view,被再次访问时,viewDidLoad方法会被调用,一般视图初始化和数据创建都在viewDidLoad方法里面做,所以界面和数据会恢复。
2.处理方法:
(1)使用数据缓存机制:为每个ViewController创建一个数据缓存池,比如使用NSMultableDictionary类型,我们把所有可以重建的数据、动态创建的视图元素引用都保存在这个缓存池中,而且每组数据都用一个Key对应。如果缓存池中已经存在这组数据了,则直接取出来用,如果不存在,则创建再使用。
(2)当发生内存警告时,如果当前视图在显示,则只清空数据,不清空视图元素引用,如果不在显示,则把数据和视图元素引用都清空。
(3)发生内存警告后,当控制器的视图重新回到window显示时,viewDidLoad方法会被调用,界面和数据会恢复。
(4)当控制器销毁时,在delloc方法中将数据缓存中的数据全部清空。
(5)当需要重置缓存中的数据时,按照Key从缓存池中删除对应的数据,然后再按照第(1)条的规则取数据。
3.遇到的问题:
苹果推荐的didReceiveMemoryWarning的实现方式是这样:
----------------------------------------------------------
-(void)didReceiveMemoryWarning{
    if (self.view.superview == nil) {
            //在此处清空一些不需要的数据
        }
    [super didReceiveMemoryWarning];
}
----------------------------------------------------------
假如此时这个视图控制发生了内存警告,数据和视图元素被释放了,然后在这个视图恢复显示之前,又发生了内存警告,就再次调用了此方法,因为在这个方法中访问了view属性,所以viewDidLoad方法会调用,视图和数据被重建,创建完之后,视图和数据又马上被清空。这个过程时多余的。
4.解决办法:
在控制器中设立一个变量,用来标志是否需要对内存警告做出响应,比如,isNeedCheckMemoryWarning,在viewDidLoad方法中将其设置为YES,在didReceiveMemoryWarning方法中检查这个值,代码如下:
----------------------------------------------------------
-(void)didReceiveMemoryWarning{
    if (isNeedCheckMemoryWarning == YES && self.view.superview == nil) {
        //在此处清空一些不需要的数据
    }
    isNeedCheckMemoryWarning = NO;
    [super didReceiveMemoryWarning];
}

八、内存警告(iOS6之后)
1.不同之处:
(1)iOS6之后viewDidUnload不再调用,当控制器的视图已经没有显示在window上时,系统会自动清空控制器中的所有视图以及输出口。
(2)因为视图的释放由系统控制了,所以当发生内存警告之后,view被再次访问,viewDidLoad不再调用。
(3)综合以上两点,所有关于界面的回收和恢复我们都可以不用管,包含动态创建的视图(可以恢复)。我们只需要关注数据。

2.处理方法与第七点的不同
<1>同样使用数据缓存池,但是数据缓存池中只存储视图之外的数据。
<2>数据缓存池的创建放到initXXX方法中,只创建一次。
<3>第三点遇到的问题不存在了,可以不用加isNeedCheckMemoryWarning变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微型计算机的应用特点,微型计算机的特点及应用

微型计算机的特点及应用计算机基础知识,1.1 走进计算机世界 计算机的发展历史 微型计算机的特点及应用 1.2 计算机是如何工作的 计算机的硬件组成 计算机的软件系统 1.3 计算机外部设备 计算机的存储设备 输入输出设备 1.4 计算机安全规范,(2)按功能分类,按功能分类一般可分为专…

田野中科院计算机网络信息中心,中国科学院计算机网络信息中心硕士生导师田野...

姓名&#xff1a;田野性别&#xff1a;男职称&#xff1a;副研究员专家类别&#xff1a;副高级邮编&#xff1a;100190邮箱&#xff1a;tianyecnic.cn通讯地址&#xff1a;北京市海淀区中关村南四街4号简历&#xff1a;田野&#xff0c;男&#xff0c;1979年6月生&#xff0c;博…

扩展函数不能返回空值html,JavaScript程序设计-中国大学mooc-题库零氪

第1章 JavaScript初探JavaScript简介随堂测验1、JavaScript由哪三部分组成( )A、ECMAScriptB、BOMC、CSSD、DOMJavaScript相关应用随堂测验1、以下哪个选项是JavaScript技术特性&#xff1f;( )A、跨平台性B、解释型脚本语言C、基于对象的语言D、具有以上各种功能HBuilder的快速…

西安邮电大学计算机学院学生会,2017年度计算机学院教职工代表大会工作报告.doc...

PAGE \* MERGEFORMAT 51凝心聚力&#xff0c;开拓创新&#xff0c;以主人翁的工作态度共谋计算机学院新发展2017/2018学年计算机学院教代会学院工作报告王忠民各位代表&#xff1a;大家下午好&#xff01;今天&#xff0c;我们在这里召开计算机学院教职工代表大会&#xff0c;回…

电子数字计算机最早应用于哪个领域,2013计算机一级B考试模拟试题及答案(2)...

无忧考网为大家收集整理了《2013计算机一级B考试模拟试题及答案(2)》供大家参考&#xff0c;希望对大家有所帮助&#xff01;&#xff01;&#xff01;1).已知“装”字的拼音输入吗是“zhang”&#xff0c;而“大”字的拼音输入码是“da”&#xff0c;它们的国标码的长度的字节…

计算机管理扫不出我的独显,win10正式版系统下检测不到独立显卡的解决方法

通常很多电脑中都会有独立显卡&#xff0c;具备单独的显存&#xff0c;不占用系统内存&#xff0c;而且技术上领先于集成显卡&#xff0c;能够提供更好的显示效果和运行性能&#xff0c;然而有win10正式版系统用户却反应说遇到检测不到独立显卡的情况&#xff0c;但是自己电脑明…

北大计算机考研题一般出自哪里,北大计算机考研常见问题解答

北大计算机考研常见问题解答高校 免费考研论坛/2007-04-11原文内容来自免费考研论坛&#xff0c;请点击查看全文http://bbs.freekaoyan.com/viewthread.php?tid123937Q: 我想了解关于北大计算机(以下简称PKUCS)考研的基本情况、数据、规则&#xff0c;怎么办&#xff1f;A: 请…

iOS中通知的使用

一、NSNotificationCenter简介&#xff1a;NSNotificationCenter是一个单进程范围内的全局通知中心&#xff0c;每一个App都有一个单例的NSNotificationCenter&#xff0c;通过一个字符串来注册和触发通知&#xff0c;为不同类之间进行消息传递和函数调用提供了一种比较简单的方…

计算机组成原理201501,计算机组成原理201501.pdf

试卷代号 1254座位号rn 国家开放大学 中央广播电视大学 2014年秋季学期 开放本科 期末考试 计算机组成原理试题 2015年1月 一 选择题 每小题3分 共36分 1 下列数中最小的数是 A 101011 2 B 51 8 C 00111001 BCD D 103 16 2 两个补码数相加 只有在符号位一一一一一时有可能产生溢…

iOS零散知识点

1.通过UIDevice类的model属性可以得知当前设备是什么&#xff0c;比如模拟器、iPhone、iPad还是iPod。2.使屏幕不变暗&#xff1a;[[UIApplication sharedApplication] setIdleTimerDisabled:YES];3.UILabel多行文本(1)UILabel可以显示多行文本&#xff0c;它有一个属性叫numbe…

大连理工大学计算机原理实验,大连理工大学计算机原理实验第一次实验-20210406081759.pdf-原创力文档...

大连理工大学实验报告实验室(房间号) &#xff1a; 420 实验台号码&#xff1a; 班级&#xff1a; 电通 1402 姓名&#xff1a; 糜智华指导教师签字&#xff1a; 成绩&#xff1a;实验 一 汇编语言上机操作 &动态调试程序 DEBUG的使用 &运算类程序设计一、实验目的和要…

计算机硬件结构控制信息,计算机硬件的基本结构

在当前的信息社会中&#xff0c;计算机扮演着非常重要的角色. 以下是Baifen编辑器汇编的计算机硬件基本结构的内容. 欢迎阅读&#xff01;电子数字计算机首先作为一种计算工具出现. 不难想象&#xff0c;如果计算机能够在没有人工干预的情况下自动完成计算&#xff0c;那么它必…

KVO和KVC简介

一、Key-Value-Observing--KVO(键值观察者模式)(1)简介&#xff1a;此机制可以在一个类中监听另外一个类的属性变化&#xff0c;包括我们自己的类和已有的Cocoa类库中的类。当被监听的类的属性发生了变化时&#xff0c;观察者会收到通知&#xff0c;可以针对属性变化添加自己的…

iOS中的异步和多线程概况

一、异步(1)当一个异步过程调用发出后&#xff0c;调用者不能立刻得到结果。实际处理这个调用的部件在完成后&#xff0c;通过状态、通知和回调来通知调用者。比如iOS类库中的NSURLConnectioin中使用代理的方式就是异步。(2)iOS类库中的异步调用提供自动的多线程并发&#xff0…

计算机系答辩麻烦,计算机专业的你,答辩时有多卑微?

你用英语都写不出来的东西就别指望用代码写了。又是一年毕业季&#xff0c;计算机专业的同学们&#xff0c;毕业设计都做好了吗&#xff1f;论文都写完了吗&#xff1f;查重过了吗&#xff1f;答辩准备好了吗&#xff1f;答辩&#xff0c;是你毕业前面临的最后一道关卡&#xf…

计算机A级作文,关于被计算机的作文(共一篇)-疾风作文网

【篇一&#xff1a;其物非故&#xff0c;其人亦存】科幻小说中&#xff0c;人工智能高度发达&#xff0c;甚至超过了人类的智力&#xff0c;计算机统治人类。看到这些&#xff0c;我们长舒一口气&#xff0c;或庆幸计算机智能暂时没有超过人类的风险&#xff0c;或是惴惴不安小…

面向对象设计与分析40讲(17)双重检查锁定(double-checked locking)范式

双重检查锁定&#xff08;也称为“双重检查锁定优化”&#xff09;是一种用于减少获取锁的开销的软件设计模式。它通过在获取锁之前测试锁定条件&#xff08;即“锁提示”&#xff09;来实现。只有在锁定条件检查表明需要锁定时才会进行锁定操作。 #include <atomic> #i…

Block总结

一、简介 Block代码块&#xff0c;本质上它和其它变量类似&#xff0c;不同的是代码块传递的是函数体&#xff0c;类似于selector的功能。调用和其它标准函数一样。声明方式有差别。二、代码块定义例&#xff1a;int ( ^ MyBlock)( int ) ^ (int m){ return m * 3; };1 …

计算机PPT03,南京大学计算机网络课件03.ppt

第3讲数据链路层 3 1数据链路层的基本概念 一 链路与数据链路 链路 link 就是一条无源的点到点的物理线路段 中间没有任何其他的交换结点 数据链路 datalink 则是另一个概念 这是因为当需要在一条线路上传送数据时 除了必须有一条物理线路外 还必须有一些必要通信协议来控制这些…

NSThread使用总结

一、创建NSThread&#xff1a;(1)使用NSThread类方法&#xff1a;detachNewThreadSelector:toTarget:withObject:该方法3个参数分别指定了线程执行的方法&#xff0c;目标&#xff0c;和传递的对象。但是要注意&#xff0c;使用这个方法时&#xff0c;并没有返回任何对象供操作…