平常开发中会遇到的内存泄漏

一、Block循环引用

防止block循环引用的方法:(弱引用)

__weaktypeof(self) weakself = self;

self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{

__strongtypeof(self) strongself = weakself;

strongself.page = 1;

[strongself.dataArr removeAllObjects];

[strongself loadData];

}];

二、delegate循环引用问题:

delegate循环引用问题比较基础,只需注意将代理属性改为weak即可

@property(nonatomic,weak) id delegate;

平常开发中会遇到的内存泄漏_第1张图片

三、NSTimer循环引用

例如下面的例子,定时器并不能最终销毁:

#import "TestNSTimer.h"

@interface TestNSTimer ()

@property (nonatomic, strong) NSTimer *timer;

@end

@implementation TestNSTimer

- (instancetype)init {

if(self = [superinit]) {

_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeRefresh:) userInfo:nil repeats:YES];

}

returnself;

}

- (void)timeRefresh:(NSTimer*)timer {

NSLog(@"TimeRefresh...");

}

- (void)cleanTimer {

[_timer invalidate];

_timer = nil;

}

- (void)dealloc {

[superdealloc];

NSLog(@"销毁");

[self cleanTimer];

}


在外部调用时:

TestNSTimer *timer = [[TestNSTimer alloc]init];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[timer release];

});

应改为:

TestNSTimer *timer = [[TestNSTimer alloc]init];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[timer cleanTimer];

[timer release];

});

需要注意cleanTimer的调用时机从而避免内存无法释放

你可能感兴趣的:(平常开发中会遇到的内存泄漏)