美文网首页
iOS内存泄漏的常见情况

iOS内存泄漏的常见情况

作者: Small_Potato | 来源:发表于2018-07-11 15:00 被阅读51次

    iOS内存泄漏的常见情况

    1.声明delegate为strong类型,简而言之,如果父VC持有子VC,并设置子VC的delegate为self(也就是父VC),这样的结果就是子VC也间接持有了父VC,造成循环引用,在Pop子VC的时候不会调用delloc。

    2.timer是否持有self,我们一般要执行一个timer的时候会用(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo 这里的aTarget一般是self,这时候就需要注意了,如果在你退出的时候这个timer还在执行的话由于这个timer会持有self,所以delloc也不会调用,这里可以用weakSelf代替self也是没有问题的。

    3.最常见的就是block导致的循环引用,解决方法也很简单,就是在block外声明__weak type(self) weakSelf = self,在block中用weakSelf就可以了,还有就是在block中如果使用了成员变量的下划线形式也要改成weakSelf.PropertyName的形式。

    3.图片没释放,instrument调试后,发现没被释放的全是imageIO,需要把读图的方式,从[UIImage imageNamed:@""],改成imageWithContentsOfFile,就可以了。

    4.使用GPUImage处理拍照的时候,内存稳定不明增长。是Xcode7.1的问题。。只在debug的时候导致内存崩溃,release的时候并不会造成内存溢出,所以可以不必管它。

    5.CoreFoundation对象(C对象) : 只要函数中包含了create\new\copy\retain等关键字, 那么这些方法产生的对象, 就必须在不再使用的时候调用1次CFRelease或者其他release函数

    6.地图类处理
    若项目中使用地图相关类,一定要检测内存情况,因为地图是比较耗费App内存的,因此在根据文档实现某地图相关功能的同时,我们需要注意内存的正确释放,大体需要注意的有需在使用完毕时将地图、代理等滞空为nil,注意地图中标注(大头针)的复用,并且在使用完毕时清空标注数组等。

    7.大次数循环内存暴涨问题
    记得有道比较经典的面试题,查看如下代码有何问题:

    for (int i = 0; i < 100000; i++) {
    NSString *string = @"Abc";
    string = [string lowercaseString];
    string = [string stringByAppendingString:@"xyz"];
    NSLog(@"%@", string);
    }

    该循环内产生大量的临时对象,直至循环结束才释放,可能导致内存泄漏,解决方法为在循环中创建自己的autoReleasePool,及时释放占用内存大的临时变量,减少内存占用峰值。

    for (int i = 0; i < 100000; i++) {
    @autoreleasepool {
    NSString *string = @"Abc";
    string = [string lowercaseString];
    string = [string stringByAppendingString:@"xyz"];
    NSLog(@"%@", string);
    }
    }
    原因:对于堆来讲(程序员自己创建的一般都在duishang),频繁的new/alloc会造成内存空间的不连续,会产生大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存快从栈中弹出

    1. ViewController的子视图对self的持有
      我们有时候需要在子视图或者某个cell中点击跳转等操作,需要在子视图或cell中持有当前的ViewController对象,这样跳转之后的back键才能直接返回该页面,同时也不销毁当前ViewController。此时,你就要注意在子视图或者cell中对当前页面的持有对象不能是强引用,尽量assign或者weak,否则会造成循环引用,内存无法释放。

    推荐一个检查内存泄漏的第三方工具:MLeaksFinder

    相关文章

      网友评论

          本文标题:iOS内存泄漏的常见情况

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