iOS易引起内存泄漏原因总结

最近通过AnalyzeLeaks等工具对项目进行了内存泄漏问题的检测及修改,现对遇到的易造成内存泄漏的问题进行一些总结,每点中都列举了会造成内存泄漏的代码书写方式,并对其原因进行分析,最后给出了相关的解决方案。

接下来就开始进行总结:

一、 循环引用

循环引用是在iOS可能引起内存泄漏的主要原因,这类问题常见的出现在Block的使用中,由于Block会持有所使用到的变量,下面就总结下Block使用中需要注意的点:

1. 在Block中使用self关键字

示例代码

@interface TestModel : NSObject

@property (nonatomic, copy) void(^TheBlock)(void);

@end

@implementation TestModel

@end


@interface TestViewController ()

@property (nonatomic, strong) TestModel *model;

@end

@implementation TestViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.model = [[TestModel alloc] init];
    self.model.TheBlock = ^{
        NSLog(@"TestViewController->%@", self);
    };
}

@end

问题分析

此类问题为最基本的循环引用问题,即TestViewController持有TestModel,TestModel持有Block,Block持有TestViewController。

解决方案

在Block中使用weakSelf打破循环引用。

2. 在Blcok中访问对象的实例变量

示例代码
@interface TestViewController ()

@property (nonatomic, copy) NSString *foo;

@end

@implementation TestViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    void(^block)(void) = ^{
        NSLog(@"foo->%@", _foo);
    };
    
    block();
}

@end
问题分析

该种写法不一定会造成内存泄漏,只有在TestViewController的持有链中持有block时才会造成内存泄漏。原因在于在Block中使用某个对象的实例变量时,会持有该对象。

解决方案

建议在Block中使用实例变量时显式指出self.weakSelf.,通过显式指出,可以在一定程度上提示开发人员注意解决self持有问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值