【问题标题】:Calling AFNetworking in NSTimer causes serious memory leak在 NSTimer 中调用 AFNetworking 会导致严重的内存泄漏
【发布时间】:2015-03-12 13:36:24
【问题描述】:

我正在尝试调试一个困难的内存泄漏。在 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 的内存管理方面,我是否遗漏了什么?

【问题讨论】:

    标签: ios objective-c memory memory-leaks


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,不过我试过了,将管理器设置为 AppDelegate 上的属性。不过运气不好。
    • @CaptainStiggz 这很奇怪。好吧,如果您使用 Instruments 分析内存泄漏,它应该会告诉您 什么 正在占用该内存。然后你就可以知道谁是罪魁祸首了。
    • 嘿,再次感谢 Johannes 的输入。我相信 AFHTTPRequestOperationManager 中存在内存问题。如果您想仔细查看,我在github 上发布了有关该问题的更多详细信息。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 2020-08-08
      • 2019-08-10
      • 2013-07-25
      • 2021-09-02
      • 1970-01-01
      相关资源
      最近更新 更多