没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
内存管理面试题
一、在
Obj-C
中,如何检测内存泄漏?你知道哪些方式?
目前我知道的方式有以下几种
Memory Leaks
Alloctions
Analyse
Debug Memory Graph
MLeaksFinder
泄露的内存主要有以下两种:
Laek Memory 这种是忘记 Release 操作所泄露的内存。
Abandon Memory 这种是循环引用,无法释放掉的内存。
上面所说的五种方式,其实前四种都比较麻烦,需要不断地调试运行,第五种是腾讯阅读团队出品,效果
好一些
二、在 MRC 下如何重写属性的 Setter 和 Getter_.md
setter
getter
重写 dealloc
三、循环引用
循环引用的实质:多个对象相互之间有强引用,不能释放让系统回收。
如何解决循环引用?
1、避免产生循环引用,通常是将 strong 引用改为 weak 引用。
比如在修饰属性时用 weak
在 block 内调用对象方法时,使用其弱引用,这里可以使用两个宏
还可以使用__block 来修饰变量
在 MRC 下,__block 不会增加其引用计数,避免了循环引用
在 ARC 下,__block 修饰对象会被强引用,无法避免循环引用,需要手动解除。
2、在合适时机去手动断开循环引用。
通常我们使用第一种。
1、代理(delegate)循环引用属于相互循环引用
delegate 是 iOS 中开发中比较常遇到的循环引用,一般在声明 delegate 的时候都要使用弱引用 weak,或
者 assign,当然怎么选择使用 assign 还是 weak,MRC 的话只能用 assign,在 ARC 的情况下最好使用 weak,
因为 weak 修饰的变量在释放后自动指向 nil,防止野指针存在
2、NSTimer 循环引用属于相互循环使用
在控制器内,创建 NSTimer 作为其属性,由于定时器创建后也会强引用该控制器对象,那么该对象和定时
器就相互循环引用了。
如何解决呢?
这里我们可以使用手动断开循环引用:
如果是不重复定时器,在回调方法里将定时器 invalidate 并置为 nil 即可。
如果是重复定时器,在合适的位置将其 invalidate 并置为 nil 即可
3、block 循环引用
一个简单的例子:
由于 block 会对 block 中的对象进行持有操作,就相当于持有了其中的对象,而如果此时 block 中的对象又持
有了该 block,则会造成循环引用。
解决方案就是使用__weak 修饰 self 即可
并不是所有 block 都会造成循环引用。
只有被强引用了的 block 才会产生循环引用
而比如 dispatch_async(dispatch_get_main_queue(), ^{}),[UIView animateWithDuration:1 animations:^{}]这些
系统方法等
或者 block 并不是其属性而是临时变量,即栈 block
还有一种场景,在 block 执行开始时 self 对象还未被释放,而执行过程中,self 被释放了,由于是用 weak
修饰的,那么 weakSelf 也被释放了,此时在 block 里访问 weakSelf 时,就可能会发生错误(向 nil 对象发消息
剩余14页未读,继续阅读
金毛写代码
- 粉丝: 1
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0