美文网首页iOS开发中所需要的问题记录
平常开发中会遇到的内存泄漏

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

作者: GuWenNuo | 来源:发表于2017-05-15 18:07 被阅读0次

    一、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;

    三、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的调用时机从而避免内存无法释放

    相关文章

      网友评论

        本文标题:平常开发中会遇到的内存泄漏

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