iOS内存泄漏的几种情况

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013943420/article/details/79830182

老生常谈的几种循环引用造成的内存泄漏问题。

1 Block和delegate

2 timer的使用

另外几种内存泄漏的情况。

1 非OC对象内存处理

在ARC下,只对OC对象进行了自动化管理。但对于非OC对象仍然需要手动释放

  • CGImageRef类型变量非OC对象,其需要手动执行释放操作CGImageRelease(ref),否则会造成大量的内存泄漏导致程序崩溃;
  • 其他的对于CoreFoundation框架下的某些对象或变量需要手动释放;
  • C语言代码中的malloc等需要对应free等都需要注意。

2 地图类处理

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

- (void)clearMapView{

    self.mapView = nil;

    self.mapView.delegate =nil;

    self.mapView.showsUserLocation = NO;

    [self.mapView removeAnnotations:self.annotations];

    [self.mapView removeOverlays:self.overlays];

    [self.mapView setCompassImage:nil];

}

3 大次数循环造成内存暴涨问题

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);

        }

    }


猜你喜欢

转载自blog.csdn.net/u013943420/article/details/79830182