热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS内存相关的知识点整理

一、原起iOS的内存相关知识是我们开发iOSAPP的基石之一,也是面试中必然会问的问题。内存知识的融会贯通,与及内存相关问题的解决,是iOS开发者必须要掌握的。二、iOS内存相关知

一、原起

iOS的内存相关知识是我们开发iOS APP的基石之一,也是面试中必然会问的问题。内存知识的融会贯通,与及内存相关问题的解决,是iOS开发者必须要掌握的。

二、iOS内存相关知识点

《iOS内存相关的知识点整理》

2.1 iOS的内存管理方式

iOS的内存管理机制为引用计数。早期使用的是MRC(手动引用计数),需要开发者自己编写引用计数的代码,对开发者是一个不小的挑战,而且容易出错,给开发者也带来了不小的苦恼。

苹果公司为了让开发者更好的专注于开发,在2011年的iOS5版本开始引入了ARC(自动引用计数),帮助开发者进行内存的管理。

ARC的工作原理大致是:当我们编译源码的时候,编译器会分析源码中每个对象的生命周期,然后基于这些对象的生命周期,来添加相应的引用计数操作代码。

2.2 内存泄漏

内存泄漏(memory leak):是指申请的内存空间使用完毕之后未回收。

一次内存泄露危害可以忽略,但若一直泄漏,无论有多少内存,迟早都会被占用光,最终导致程序crash。(因此,开发中我们要尽量避免内存泄漏的出现)

内存泄漏的现象:程序的可用内存越来越少,最终导致程序崩溃。

2.3 内存溢出

内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用。

内存溢出的现象:程序直接重启或者崩溃。

2.4 内存泄漏的检测

  • 第一种:静态分析方法(Analyze)
  • 第二种:动态分析方法(Instrument工具库里的Leaks)

2.5 常见的发生内存泄漏的场景

2.5.1 AFHTTPSessionManager

AFHTTPSessionManager发生内存泄漏的解决方案在此。

2.5.2 ViewController中的NSTimer

VC中使用NSTImer的示例如下:

[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(updateTime:)
userInfo:nil
repeats:YES];

理由:这时 target: self,增加了ViewController的retain count
self强引用timertimer强引用self,造成循环引用。
解决方案:在恰当时机调用[timer invalidate]即可。

2.5.3 ViewController中的delegate

对于delegate我们一般都是使用weak修饰,这个不多作解释。

2.5.4 ViewController中Block

在我们日常开发中,如果block使用不当,很容易导致内存泄漏。

理由:如果block被当前ViewController(self)持有,这时,如果block内部再持有ViewController(self),就会造成循环引用。
解决方案:在block外部弱化self,再在block内部强化已经弱化的weakSelf

三、 iOS内存管理

《iOS内存相关的知识点整理》
iOS的内存管理机制是:引用计数。MRC基本上已经绝迹,现在主流的还是ARC。系统的内存分为栈内存堆内存栈内存是系统管理的,不需要开发者插手,开发者管理的主要是堆内存

当下我们使用ARC(自动引用计数)进行管理的是堆内存

3.1 内存管理的原则

当我们使用allocnew创建对象之后,对象的引用计数为1.
当我们对对象进行strongcopy操作之后,对象的引用计数+1.
当我们对对象进行mutableCopy操作之后,生成了一份对象的拷贝,而不是简单的引用计数+1,这个需要特别注意。
当我们不再持有对象时,对象的引用计数-1
当对象的引用计数为0时,对象会被释放掉,进行内存的回收。

3.2 需要开发者自己管理的内存

core foundation框架主要提供的是C语言的API,不属于ARC管理的范畴,所以使用core foundation创建的对象,需要开发者自己进行内存的管理,在对象使用完毕之后进行内存的回收,否则会进行内存的泄漏。

3.3 内存峰值

开发中,对于一些大循环如果把控不好,会出现内存峰值过高的情况,这个时候我们需要在循环的内部合理的使用autoreleasepool进行内存峰值的管理。

总结

本文主要是对iOS内存相关的知识点进行了一个归纳总结。

  • iOS的内存管理方式为引用计数,分为MRCARC
  • 内存泄漏的原因。
  • 内存溢出的原因。
  • 内存泄漏的排查方法,静态排查&动态排查
  • 内存泄漏的常见场景。
  • 内存峰值的管理。

推荐阅读
  • imnewtotheswiftandxcodeworld,soimhavingaproblemtryingtointegrateapackagetomypro ... [详细]
  • Myappcrashedandthecodeisthefollowing:我的应用程序崩溃,代码如下:elseif(){CGDetailVie ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • ScrollView嵌套Collectionview无痕衔接四向滚动,支持自定义TitleView
    本文介绍了如何实现ScrollView嵌套Collectionview无痕衔接四向滚动,并支持自定义TitleView。通过使用MainScrollView作为最底层,headView作为上部分,TitleView作为中间部分,Collectionview作为下面部分,实现了滚动效果。同时还介绍了使用runtime拦截_notifyDidScroll方法来实现滚动代理的方法。具体实现代码可以在github地址中找到。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • http:oj.leetcode.comproblemsminimum-depth-of-binary-tree贡献了一次runtimeerror,因为如果输入为{}即空的时候,出 ... [详细]
author-avatar
Jie
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有