AFNetworking 代码给我内存泄漏

Posted

技术标签:

【中文标题】AFNetworking 代码给我内存泄漏【英文标题】:AFNetworking code giving me Memory Leaks 【发布时间】:2015-03-12 12:12:10 【问题描述】:
@implementation GetData

static NSString *string = @"https://afternoon-springs-7986.herokuapp.com/";
static NSString *baseStr = @"https://afternoon-springs-7986.herokuapp.com/updateInformation";    

-(void) postEventInfo: (NSDictionary *) eventInfoObject


    
        NSURL *url = [NSURL URLWithString:string];  // 6.5%
       // NSURL *baseURL = [NSURL URLWithString:@"http://localhost:5000/"];

        UIWindow *window = [[UIApplication sharedApplication] keyWindow];
        UIView *topView = window.rootViewController.view;

        self.manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url]; // 71%
        self.manager.requestSerializer = [AFJSONRequestSerializer serializer];
        self.manager.responseSerializer = [AFJSONResponseSerializer serializer]; // 9.7%

        [self.manager POST:@"/addEvent/" parameters:eventInfoObject success:^(NSURLSessionDataTask *task, id responseObject)  // 12.9%

        [FVCustomAlertView showDefaultDoneAlertOnView:topView withTitle:@"Klart!"];

         failure:^(NSURLSessionDataTask *task, NSError *error) 

        [FVCustomAlertView showDefaultErrorAlertOnView:topView withTitle:@"Ett fel uppstod, försök igen!"];
        ];
    

我收到上面这段代码的内存泄漏。如您所见,我评论的百分比与泄漏仪器所做的相同。我正在运行 Xcode 6,并在我的 iPhone 设备 5s ios 7.1.1 上进行了测试

这里是如何泄漏工具的屏幕截图。 https://www.dropbox.com/s/beh4no79wgk54bm/Screen%20Shot%202015-03-12%20at%2013.09.53.png?dl=0

【问题讨论】:

【参考方案1】:

每次调用“postEventInfo”时,都会创建一个AFHTTPSessionManager 对象。

如果您使用 ARC,这应该意味着旧对象被释放(即不是这样的问题)。但为了获得最佳实践,您应该这样做:

// set self.manager only if it hasn't been created yet
if(!self.manager)

    self.manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url]; // 71%
    self.manager.requestSerializer = [AFJSONRequestSerializer serializer];
    self.manager.responseSerializer = [AFJSONResponseSerializer serializer]; // 9.7%

【讨论】:

如果我只是创建一个 AFHTTPSessionManager 的属性并在不同的地方使用它会不会一样?既然我有另一种发布方法? 我觉得应该没问题,不过话说回来,你会同时给这两个帖子打电话吗?来自同一个类/视图控制器? 我按照你说的做了,但是第二次它仍然出现在 if 语句中,所以 if(!self.manager) 没有起作用 有没有其他方法可以查看对象是否已经初始化? 我猜你说的是真的,因为泄漏总是在我第二次调用 postEvent 方法时出现。但我 self.manager 总是 nil 有什么问题?

以上是关于AFNetworking 代码给我内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 中避免由于 AFNetworking 导致的内存泄漏

关于IOS AFNetWorking内存泄漏的问题

IOS 中 AFNetworking 缓存图像中的内存泄漏

使用 AFHTTPSessionManager 时的内存泄漏

奇怪的内存泄漏

APP出现内存泄漏的几种情况