内存管理相关

内存管理相关面试题

一· 使用CADisplayLink,NSTimer有什么注意点?

其中创建定时器的方式有:NSTimer,CADisplayLink(可以用在卡顿检测(检测应用程序的帧率)及自定义动画中,它的调用频率和设备屏幕刷新频率一致),GCD(更加准时,因为它不依赖与runloop,直接基于内核实现,更加高效)
答:(1)循环引用问题 (2)不准时的问题(runloop跑圈执行时间问题和runloop模式问题,default模式下滚动视图滚动的时候会影响到定时器)

截屏2019-12-11下午6.05.54.png

解决方式

其实创建中间对象直接继承于NSProxy就行,NSProxy和NSObject是平级的,用它做消息转发的话 省掉了方法动态解析的这个流程。所以直接用它就行了
截屏2019-12-11下午7.31.15.png

问题一解决方案

建议使用GCD定时器!因为NSTimer和CADisplayLink都依赖于runloop,而runloop就是不停的跑圈,每跑一圈检查一下累计的时间,每次任务可能不一样那么跑完一圈花费的时间也不一样,比如这次跑完一圈0.7秒还没到一秒不执行定时器的方法,继续跑下一圈恰巧这圈任务较重 跑了0.4秒 这个时候再去执行定时器的方法就慢了,所以就不准确了。而GCD创建的定时器是不依赖于runloop的 是直接和系统内核挂钩的,所以也不会受滚动视图的影响

销毁timer的方式

[图片上传中...(image.png-3b932-1586956747605-0)]
二· 介绍下内存的几大区域
地址由低到高内存布局为:保留内存--代码段--数据段(数据段里依次是字符串常量,已初始化数据,未初始化数据)--堆区--栈区--内存区。
堆区(heap)一般由程序员分配释放
栈区(stack)— 由编译器自动分配释放

1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局(静态)区包含下面两个分区:

数据区:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。
BSS区:BSS段包含了程序中未初始化全局变量。
4、文字常量区 —常量字符串就是放在这里的。程序结束后由系统释放。

5、程序代码区—存放函数体的二进制代码。

iOS程序的内存布局。 注意:堆空间地址分配是越来越大就是由低到高(记忆辅助:堆需要一点一点堆大,所以地址分配是越来越大),而栈空间是由高到低

内存布局:栈区:存储局部变量(不包含字符串常量),在作用域结束后内存会被回收

三· 讲一下你对iOS内存管理的理解

内存管理
weak和__unsafe__unretained都是弱引用,但是weak所指向内存被释放之后,weak所修饰的对象会自动置为nil;而 __unsafe__unretained ,assign修饰的会仍然指向原对象的内存地址,变成野指针。注意野指针不一定崩溃的,就比如if(person3)不会崩,若打印内存地址就会崩溃或者调用isKindof会崩溃

四· autorelease对象在什么时机会被调用release?

截屏2019-12-12下午10.05.54.png

截屏2019-12-12下午10.33.21.png

方法里有局部对象,出了方法后会被立即释放吗?

iOS系统在运行程序时,会自动创建一些线程,⚠️每个线程都默认拥有自动释放池。一个线程对应一个runloop(解释在runloop的模式里,有default和tracking,而commons相对与一个几何,一个线程对应唯一一个runloop,commons的模式其实时按照设定的标志符区切换的)

答:分两种情况:
(1)(不分ARC还是MRC)

  • 在主线程的时候:如果局部对象是通过autorelease形式释放的话,那么它不是马上释放,因为它是由runloop控制,而是在局部变量所在的runloop循环中,等Runloop休眠之前调用release操作进行释放。
  • 在子线程的时候,当没有开启runloop的时候,会在子线程结束的时候会出发AutoreleasePoolPage的tls_dealloc方法,清空aoturelease对象;
  • 子线程开启的情况下,那就是在最近一次runloop执行事件循环时,释放autorelease对象;
    (2)在 arc 下,编译器帮我们添加的代码是在出方法前调用 [obj release],所以就是出了作用域(方法)会立即释放

自动释放池是怎么管理对象的?


截屏2019-12-19上午3.46.47.png
截屏2019-12-19上午3.45.26.png

截屏2019-12-19上午3.45.41.png

五.内存泄漏问题

ARC虽然可以帮助开发者解决大部分内存管理问题,但对内存泄漏仍然束手无策。

5.1 内存泄漏的核心问题是循环引用,那么循环引用的场景都有哪些呢?
  • 代理用strong修饰的话会循环引用,所以要用weak区修饰。
  • Block与循环引用
  • 定时器引起的内存泄漏
    其中定时器的场景有:NSTimer,CADisplayLink,还有PerformSelctor延迟方法。
5.1.1 重点说一下performSelector...delay...造成的内存泄漏

问题描述:testPerformSelectorFunc在viewDidDisappear之后执行,也就是在页面返回disappear以后,dealloc方法并没有执行,控制器对象并没有真正销毁,造成了内存泄漏。而等达到10s时间的时候,虽然该控制器已经disappear了,但还会执行该页面的代码testPerformSelectorFunc方法,执行完这个方法,才执行了dealloc方法,对象才得到了释放,证明执行完performSelector方法后self.retainCount会对应减少(个人理解:点击POP之后,也就是说如果func方法还没执行,那么不会走dealloc方法,self不会释放,当执行完这个方法之后才会调用dealloc,对象才能真正被释放)。

  • 为了避免这种场景的内存泄漏,那么需要取消未执行的延时函数,对象就可以马上释放,加上这句代码即可:
[NSObject cancelPreviousPerformRequestsWithTarget:self]

- 内存泄漏和内存溢出的区别?就是内存溢出是内存不够,常见的就是数组越界,就比如存一个long大的数,却给了一个int类型的存储空间。如果内存泄漏不注意,有可能导致内存溢出,因为大量的对象不被释放,存在内存中,会占用越来越多的空间

6.创建大量临时自动释放对象 造成内存爆增现象

问题?:不加自动释放池的话,V啥时候释放呢?

  • 咱也不知道长眼睛干嘛,可能只是单纯的好看。。。看截图的第二段啊!在大多数情况下,开发者都不必手动创建自动释放池,,但是有一种情况除外,系统的释放池会在每次事件循环结束后清空,所以不加自动释放池的话,V会在系统的runloop循环结束后再做清空操作。所以这个时候由于瞬时有大量的对象生成所以会导致内存爆增。那么这个时候就需要我们手动创建自动释放池。
    加了之后的好处就是下一个截图所示:当自动缓冲池结束后,其会向添加进自动释放池的所有对象发送release消息,也就是每次循环自动释放池子都会对V发送release,所以就会在短时间内临时变量瞬间在内存中爆满,不能及时得到释放。这也是性能优化中对内存占用的一种优化
这也解释了,为什么要用autorelease,它可以优化内存,因为系统的自动释放池会在每次事件循环结束后清空,发送release
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335