区块链技术博客
www.b2bchain.cn

【iOS性能优化】四、内存泄露检测求职学习资料

本文介绍了【iOS性能优化】四、内存泄露检测求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

大家好,欢迎来到iOS性能优化。
上篇文章为大家讲解了安装包瘦身,这篇文章继续为大家讲解下内存泄露检测。

  • 造成内存泄漏原因
  • 常见循环引用及解决方案

造成内存泄漏原因

  • 在用C/C++时,创建对象后未销毁,比如调用malloc后不free、调用new后不delete;
  • 调用CoreFoundation里面的C方法后创建对对象后不释放。比如调用CGImageCreate不调用CGImageRelease;
  • 循环引用。当对象A和对象B互相持有的时候,就会产生循环引用。常见产生循环引用的场景有在VC的cellForRowAtIndexPath方法中cell block引用self。

常见循环引用及解决方案

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-strong dance
__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 delegate;

大家好,欢迎来到iOS性能优化。
上篇文章为大家讲解了安装包瘦身,这篇文章继续为大家讲解下内存泄露检测。

  • 造成内存泄漏原因
  • 常见循环引用及解决方案

造成内存泄漏原因

  • 在用C/C++时,创建对象后未销毁,比如调用malloc后不free、调用new后不delete;
  • 调用CoreFoundation里面的C方法后创建对对象后不释放。比如调用CGImageCreate不调用CGImageRelease;
  • 循环引用。当对象A和对象B互相持有的时候,就会产生循环引用。常见产生循环引用的场景有在VC的cellForRowAtIndexPath方法中cell block引用self。

常见循环引用及解决方案

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-strong dance
__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 delegate;

大家好,欢迎来到iOS性能优化。
上篇文章为大家讲解了安装包瘦身,这篇文章继续为大家讲解下内存泄露检测。

  • 造成内存泄漏原因
  • 常见循环引用及解决方案

造成内存泄漏原因

  • 在用C/C++时,创建对象后未销毁,比如调用malloc后不free、调用new后不delete;
  • 调用CoreFoundation里面的C方法后创建对对象后不释放。比如调用CGImageCreate不调用CGImageRelease;
  • 循环引用。当对象A和对象B互相持有的时候,就会产生循环引用。常见产生循环引用的场景有在VC的cellForRowAtIndexPath方法中cell block引用self。

常见循环引用及解决方案

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-strong dance
__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 delegate;

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 【iOS性能优化】四、内存泄露检测求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们