综合暂存iOS性能调优

iOS性能优化 — 四、内存泄露检测

2020-10-26  本文已影响0人  iOS开发面试题技术合集

原文作者:akon
原文地址:https://xiaozhuanlan.com/topic/2397408651

上篇文章为大家讲解了安装包瘦身,这篇文章继续为大家讲解下内存泄露检测。

造成内存泄漏原因

常见循环引用及解决方案

1) 在VC的cellForRowAtIndexPath方法中cell的block直接引用self或者直接以_形式引用属性造成循环引用。

 cell.clickBlock = ^{
        self.name = @"akon";
    };

cell.clickBlock = ^{
        _name = @"akon";
    };

解决方案:把self改成weakSelf;

__weak typeof(self)weakSelf = self;
    cell.clickBlock = ^{
        weakSelf.name = @"akon";
    };

2)在cell的block中直接引用VC的成员变量造成循环引用。

//假设 _age为VC的成员变量
@interface TestVC(){

    int _age;

}
cell.clickBlock = ^{
       _age = 18;
    };

解决方案有两种:

__weak typeof(self)weakSelf = self;
cell.clickBlock = ^{
      __strong typeof(weakSelf) strongSelf = weakSelf;
       strongSelf->age = 18;
    };

//假设 _age为VC的成员变量
@interface TestVC()

@property(nonatomic, assign)int age;

@end

__weak typeof(self)weakSelf = self;
cell.clickBlock = ^{
       weakSelf.age = 18;
    };

3)delegate属性声明为strong,造成循环引用。

@interface TestView : UIView

@property(nonatomic, strong)id<TestViewDelegate> delegate;

@end

@interface TestVC()<TestViewDelegate>

@property (nonatomic, strong)TestView* testView;

@end

 testView.delegate = self; //造成循环引用

解决方案:delegate声明为weak

@interface TestView : UIView

@property(nonatomic, weak)id<TestViewDelegate> delegate;

@end

4)在block里面调用super,造成循环引用。

cell.clickBlock = ^{
       [super goback]; //造成循环应用
    };

解决方案,封装goback调用

__weak typeof(self)weakSelf = self;
cell.clickBlock = ^{
       [weakSelf _callSuperBack];
    };

- (void) _callSuperBack{
    [self goback];
}

5)block声明为strong
解决方案:声明为copy
6)NSTimer使用后不invalidate造成循环引用。
解决方案:


*   (NSTimer *)ak_scheduledTimerWithTimeInterval:(NSTimeInterval)interval
    block:(void(^)(void))block
    repeats:(BOOL)repeats{

    return [self scheduledTimerWithTimeInterval:interval
    target:self
    selector:@selector(ak_blockInvoke:)
    userInfo:[block copy]
    repeats:repeats];
    }

*   (void)ak_blockInvoke:(NSTimer*)timer{

    void (^block)(void) = timer.userInfo;
    if (block) {
    block();
    }
    }

怎么检测循环引用

资料推荐

如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群1012951431来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

上一篇下一篇

猜你喜欢

热点阅读