在NSTimer中调用AFNetworking会导致严重的内存泄漏

时间:2015-03-12 13:36:24

标签: ios objective-c memory memory-leaks

我正在尝试调试困难的内存泄漏。在MyAppDelegate.m中,我有

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.notificationTimer = [NSTimer scheduledTimerWithTimeInterval:1
                                                              target:self
                                                            selector:@selector(syncNotifications:)
                                                            userInfo:nil
                                                             repeats:YES];
    return YES;
}

- (void)syncNotifications:(NSTimer*)timer {
    NSString *path = @"http://example";
    NSLog(@"GET: %@", path);
    AFHTTPRequestOperationManager *network = [AFHTTPRequestOperationManager manager];
    [network GET:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"get success");
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

我看到内存以~1MB / 3秒的速度泄漏。我已经尝试将网络设置为属性。还尝试按如下方式注释掉实际的网络请求:

- (void)syncNotifications:(NSTimer*)timer {
    NSString *path = @"http://example";
    NSLog(@"GET: %@", path);
    AFHTTPRequestOperationManager *network = [AFHTTPRequestOperationManager manager];
}

虽然我没有看到泄漏的内存量,但我仍然看到“仪器”面板中的内存分配有所增加。在NSTimers的内存管理方面,我是否遗漏了一些内容?

2 个答案:

答案 0 :(得分:2)

问题是您每秒都在创建AFHTTPRequestOperationManager的新实例。 manager方法的实现如下所示:

+ (instancetype)manager {
    return [[self alloc] initWithBaseURL:nil];
}

因此,如果您创建一次管理器并坚持使用它,您应该能够修复内存泄漏。

答案 1 :(得分:0)

经过大量测试后,我发现了"问题"似乎与AFHTTPRequestOperation有关。我没有看到任何"泄漏"切换到AFHTTPSessionManager时。

有关更多信息,请参阅: https://github.com/AFNetworking/AFNetworking/issues/2596