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