请注意,在iOS 9上,安全框架会分配大约4k的SSL缓存数据,并在您为新的NSURLSession对象恢复任务时首次向您的应用程序收取费用。
Apple Technical Q&A QA1727告诉我们,这个SSL缓存会持续10分钟,无论如何,因为它是私有的并且完全由系统管理(因为安全!)。
在您的代码示例中,每次发出请求时都会创建一个新的NSURLSession对象。但是,您只是使用了defaultSessionConfiguration,并没有指定可能存在强引用的委托,那么您应该做的是使用单例
[NSURLSession sharedSession]
并使用
resetWithCompletionHandler
来清除非安全分配。或者如果您想自定义配置,则可以创建自定义单例。
(NSURLSession *)sharedSession 讨论
对于基本请求,URL 会话类提供了一个共享的单例会话对象,它为您提供了合理的默认行为。通过使用共享会话,您可以仅用几行代码将 URL 的内容获取到内存中。
与其他会话类型不同,您不需要创建共享会话;您只需调用 [NSURLSession sharedSession] 来请求它。因此,您不提供委托或配置对象。因此,使用共享会话:
- 您无法逐步获取从服务器到达的数据。
- 您无法显着自定义默认连接行为。
- 您的执行身份验证的能力有限。
- 您不能在应用程序未运行时执行后台下载或上传。
共享会话使用共享 NSURLCache、NSHTTPCookieStorage 和 NSURLCredentialStorage 对象,使用共享的自定义网络协议列表(使用 registerClass: 和 unregisterClass: 配置),并基于默认配置。
在使用共享会话时,通常应避免自定义缓存、cookie 存储或凭据存储(除非您已经在使用 NSURLConnection 进行自定义),因为很有可能您最终会超出默认会话的功能范围,此时您将不得不以适用于自定义 URL 会话的方式重写所有这些自定义内容。
换句话说,如果您正在处理缓存、cookie、身份验证或自定义网络协议等任何内容,则应该使用默认会话而不是默认会话。
(来自NSURLSession类参考文档...斜体是我加的;P)
如果您没有使用Apple提供的sharedSession
单例,那么您应该至少从Apple那里学习并创建一个具有会话属性的单例。会话的目的是它旨在比仅限于一个请求更长时间地存在。尽管他们的文档不太清楚,但Apple提供了一个单例,并将其称为“会话”,这表明会话对象的寿命应该比单个请求更长。
是的,你应该在某个时候调用invalidateAndCancel
,但不是在每个单独的请求之后,甚至不是在每个请求都发送到完全不同的服务器上的情况下(这几乎从未发生)。只有当您要断开与特定会话的引用时,才需要使其无效并取消;否则,您可以在会话上调用flushWithCompletionHandler
或resetWithCompletionHandler
来刷新会话的堆分配到VM,或重置以清除堆和VM存储。(还请参见我的答案here。)