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

Calling AFNetworking in NSTimer causes serious memory leak

我正在尝试调试一个棘手的内存泄漏问题。在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];
}

虽然我没有看到太多内存泄漏,但我确实看到 Instruments 面板中的内存分配在攀升。关于 NSTimers 的内存管理,我是否遗漏了什么?

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

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

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

经过大量测试,我发现"problem"似乎与AFHTTPRequestOperation有关。切换到 AFHTTPSessionManager 时,我没有看到任何 "leaks"。

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