Objective c AFHTTPSessionManager未解除分配 更新

Objective c AFHTTPSessionManager未解除分配 更新,objective-c,memory-management,afnetworking-2,Objective C,Memory Management,Afnetworking 2,在将此作为一个问题发布到AFNetworking repo之后,我发现这实际上是一个使用问题。根据对我的问题的答复: NSURLSession保留其委托(即AFURLSessionManager)。调用invalidateSessionCancelingTasks:确保会话完成并释放其委托 因此,长话短说:如果您以下面描述的方式使用AHTTPSessionManager,请确保调用invalidateSessionCancelingTasks:,以确保会话完成并释放其委托 原始问题 我有一个子类

在将此作为一个问题发布到AFNetworking repo之后,我发现这实际上是一个使用问题。根据对我的问题的答复:

NSURLSession保留其委托(即AFURLSessionManager)。调用invalidateSessionCancelingTasks:确保会话完成并释放其委托

因此,长话短说:如果您以下面描述的方式使用
AHTTPSessionManager
,请确保调用
invalidateSessionCancelingTasks:
,以确保会话完成并释放其委托

原始问题 我有一个子类
AFHTTPSessionManager
,名为
GTAPIClient
,用于连接我的restapi。我意识到docs状态可以作为一个单例使用,但在一些情况下,我需要创建一个新实例。然而,似乎每当我这样做时,对象永远不会被释放。目前,
GTAPIClient
在解除分配时除了
NSLog
本身之外,实际上什么都不做。 下面是一些演示该行为的示例代码

GTAPIClient.m GTViewController.m NSLog输出 激发
makeClient:

//It seems to me that both NSLog's should return (null) as they are assigning to a weak property
2014-06-22 16:41:39.143 I just made an API client <GTAPIClient: 0x10b913680, baseURL: (null), session: <__NSCFURLSession: 0x10b915010>, operationQueue: <NSOperationQueue: 0x10b9148a0>{name = 'NSOperationQueue 0x10b9148a0'}>
2014-06-22 16:41:39.144 I just made a random object (null)

作为参考,我使用的是AFNetworking的v2.3.1。编译器警告我,将保留对象分配给弱属性将在分配后释放-这是正确的,并且与我的随机对象的预期功能相同。应用程序中没有任何其他内容。没有其他视图控制器,在
GTAPIClient
上没有其他方法,所有单例功能都被删除。关于我在这里做错了什么有什么想法吗?

复制您的场景并通过工具运行它表明,AFURLSessionManager由它们创建的NSURLSessions保留,因为AFURLSessionManager充当创建的每个NSURLSession的代理。这将创建一个保留周期,因此无法释放AFHTTPSessionManager。这是不是任何一个库中的bug,或者根本不是bug,我不确定。您可能希望在AFGithub页面()上进行报告。

在此处发布Mattt Thompson的回复,以帮助未来的读者:

NSURLSession
(即
AFURLSessionManager
)。调用
invalidateSessionCancelingTasks:
以确保会话完成并释放其委托


如果像许多应用程序一样,您的应用程序对整个应用程序使用单例会话管理器和一个URL会话,那么您就不必担心这一点。

非常好。我在回购协议上发布了一个问题:()
__weak typeof(manager) weak_manager = manager;
[manager requestWithMethod:method URLString: uri parameters:param
         success:^(NSURLSessionDataTask *task, id responseObject) {
                if (completion) {
                    completion(YES, responseObject, task.response);
                }
                [weak_manager invalidateSessionCancelingTasks:YES];
         }
         failure:^(NSURLSessionDataTask *task, NSError *error) {
                if (completion) {
                    completion(NO, error, task.response);
                }
                [weak_manager invalidateSessionCancelingTasks:YES];
         }];
//It seems to me that both NSLog's should return (null) as they are assigning to a weak property
2014-06-22 16:41:39.143 I just made an API client <GTAPIClient: 0x10b913680, baseURL: (null), session: <__NSCFURLSession: 0x10b915010>, operationQueue: <NSOperationQueue: 0x10b9148a0>{name = 'NSOperationQueue 0x10b9148a0'}>
2014-06-22 16:41:39.144 I just made a random object (null)
//Again, both NSLog's should return null for the two objects. However...client is still around. Also, it's overridden dealloc method never fired.

2014-06-22 16:44:43.722  Client: <GTAPIClient: 0x10b913680, baseURL: (null), session: <__NSCFURLSession: 0x10b915010>, operationQueue: <NSOperationQueue: 0x10b9148a0>{name = 'NSOperationQueue 0x10b9148a0'}>
2014-06-22 16:44:43.723 Entity: (null)
__weak typeof(manager) weak_manager = manager;
[manager requestWithMethod:method URLString: uri parameters:param
         success:^(NSURLSessionDataTask *task, id responseObject) {
                if (completion) {
                    completion(YES, responseObject, task.response);
                }
                [weak_manager invalidateSessionCancelingTasks:YES];
         }
         failure:^(NSURLSessionDataTask *task, NSError *error) {
                if (completion) {
                    completion(NO, error, task.response);
                }
                [weak_manager invalidateSessionCancelingTasks:YES];
         }];