美文网首页
ARC 下内存泄露的那些点

ARC 下内存泄露的那些点

作者: lionsom_lin | 来源:发表于2018-01-03 14:28 被阅读8次

ARC 下内存泄露的那些点

一、block 系列

ARC 下,当 block 获取到外部变量时,由于编译器无法预测获取到的变量何时会被突然释放,为了保证程序能够正确运行,让 block 持有获取到的变量,向系统显明:我要用它,你们千万别把它回收了!然而,也正因 block 持有了变量,容易导致变量和 block 的循环引用,造成内存泄露!

二、performSelector 系列

performSelector 顾名思义即在运行时执行一个 selector,最简单的方法如下

- (id)performSelector:(SEL)selector;

这种调用 selector 的方法和直接调用 selector 基本等效,执行效果相同

[object methodName];
[object performSelector:@selector(methodName)];

三、addObserver 系列

addObserver 即 Objective-C 中的观察者,此系列常见于 NSNotification、KVO 注册通知。注册通知时,为了防止 observer 被突然释放,造成程序异常,需要持有 observer,这是造成内存泄露的一个隐患之一。

所以为什么需要在代码的 dealloc 方法中移除通知,原因就在于此。

NSNotificationcenter 需要 removeObserver 的原因是如果不移除的话,被观察者那么还会继续发送消息。如果此时观察者已经释放,消息会转发给其他对象,有可能造成严重的问题Effective Objective-C Notes:理解消息传递机制

四、NSTimer

在使用 NSTimer addtarget 时,为了防止 target 被释放而导致的程序异常,timer 会持有 target,所以这也是一处内存泄露的隐患。

// NSTimer 内存泄露
/**
 * self 持有 timer,timer 在初始化时持有 self,造成循环引用。
 * 解决的方法就是使用 invalidate 方法销掉 timer。
 */
// interface
@interface SomeViewController : UIViewController
@property (nonatomic, strong) NSTimer *timer;
@end
//implementation
@implementation SomeViewController
- (void)someMethod
{
    timer = [NSTimer scheduledTimerWithTimeInterval:0.1  
                                             target:self  
                                           selector:@selector(handleTimer:)  
                                           userInfo:nil  
                                            repeats:YES];  
}
@end

五、try...catch

Apple 提供了 错误处理(NSError)和 异常处理(NSException)两种机制,而 try...catch 就是使用 exception 捕获异常。NSError 应用在在绝大部分的场景下,并且这也是 Apple 所推荐。那什么时候用 NSException 呢?在极其严重的直接导致程序崩溃情况下才使用,并且无需考虑恢复问题。

欢迎大家多提供建议,便于完善!

相关文章

  • 内存泄漏/管理

    ARC 下内存泄露的那些点performSelector延时调用导致的内存泄露iOS ARC下几种导致内存泄露的场...

  • ARC 下内存泄露的那些点

    ARC 下内存泄露的那些点 一、block 系列 在 ARC 下,当 block 获取到外部变量时,由于编译器无法...

  • ARC 下内存泄露的那些点

    block 解决循环引用 这样确实解决了循环引用,但考虑另一种情况。 这时,虽然循环引用解决了,但是异步打印却没有...

  • ARC 下内存泄露的那些点

    在网上搜了一下,发现这篇文章是第一篇、也是唯一 一篇总结 ARC 内存泄露的博客,哈哈好兴奋。 在 iOS 4.2...

  • 使用富文本OHAttributedLabel

    使用教程: 请在arc下使用,不要arc与mrc混用造成内存泄露! 源码地址 http://pan.baidu....

  • ARC下内存泄露总结

    1、Block的循环引用   在iOS4.2时,Apple推出ARC内存管理机制。这是一种编译期的内存管理方式,在...

  • 内存及性能优化

    1. 用ARC管理内存 ARC除了帮你避免内存泄露,ARC还可以帮你提高性能,它能保证释放掉不再需要的对象的内存。...

  • iOS 内存管理机制

    最近接手的一个 APP 项目有内存泄露问题, 由于用了 ARC 管理内存, 使得找出哪里内存泄露了变得更加困难, ...

  • 增强iOS应用程序性能方法

    1. 使用ARC进行内存管理 ARC除了能避免内存泄露外,还有助于程序性能的提升 2.在适当的情况下使用reuse...

  • ARC下内存泄露的几种情况

    delegate设为strong造成的内存泄露(两个对象相互强引用) NSTimer 造成的内存泄露(两个对象相互...

网友评论

      本文标题:ARC 下内存泄露的那些点

      本文链接:https://www.haomeiwen.com/subject/dhvvgxtx.html