ios NSURL सत्र HTTP/2 मेमोरी रिसाव



memory-leaks nsurlsession (1)

यह मेरा टेस्ट मामले, बताते हैं कि जब एक HTTP / 2 कनेक्शन के साथ NSURL सत्र का उपयोग होता है तो स्मृति समस्या होती है।

test1: आईओएस 9। HTTP / 2 सर्वर

अगर मैं अपलोड की गई फ़ाइल को ठीक कर लेता हूं, तो मैं एक HTTP / 2 सर्वर पर 10 एम फ़ाइल अपलोड करने के लिए NSURL सत्र का उपयोग करता हूं, लेकिन अगर मैं अपलोड करने से पहले इसे पूरा कर देता हूं, तो 10 एम कभी भी रिलीज़ नहीं होगा।

test2: आईओएस 9। HTTP1.1 सर्वर

मैं एक https1.1 फ़ाइल सर्वर के साथ एक ही कोड का परीक्षण करता हूं, मैं अपलोड कार्य को रद्द कर देता हूं या नहीं, सब कुछ ठीक है, मेमोरी को सामान्य पर वापस किया जाता है। (10 एम डेटा जारी किया गया है)

test3 IOS 8. HTTP / 2 सर्वर

इस मामले में सब कुछ ठीक है। (NSURL सत्र ने HTTP / 2 को प्रोटोकॉल बातचीत नहीं की थी)

इसलिए, यहां तक ​​कि मेरे द्वारा उपयोग किए जाने वाले एनएसURL सत्र के साथ कुछ भी उपयुक्त नहीं है, एचटीटीपी / 2 के साथ एनएसकेआरएसएशन प्रदर्शन सामान्य नहीं है

मेमोरी समस्या के अलावा, जब फ़ाइल को अपलोड करने के लिए HTTP / 2 के साथ NSURLSession का उपयोग करना प्रगति खंड का आकार बहुत बड़ा होता है (एक कॉल बैक में मई 2M 'didSendBodyData')

मैंने यह पृष्ठ भी पढ़ा था। एसएसएल कुछ चीज़ कैश कर सकता है, लेकिन पूरी फाइल को कैश नहीं करना चाहिए। (जब मैं कार्य रद्द कर देता हूं या समय-समय पर अनुरोध करता हूं, 10 एम फ़ाइल आकार मेमोरी लीक)

किसी को पता है कि समस्या का कारण क्या है, मुझे कुछ सहायता दे सकती है धन्यवाद।

प्रश्न अद्यतन 0912: एक परीक्षण परियोजना लिंक जोड़ें

टेस्ट प्रोजेक्ट: https://github.com/upyun/swift-sdk/tree/testleak

file:UPUtils.swift
//Change the url to make comparison test. 

//let DEFAULT_UPYUN_FORM_API_DOMAIN = "http://v0.api.upyun.com"//http1.1
//let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://httpbin.org/post" //https1.1
let DEFAULT_UPYUN_FORM_API_DOMAIN = "https://v0.api.upyun.com"//http2

सेब डॉक्टर से:

सत्र ऑब्जेक्ट आपके ऐप के बाहर निकलते समय प्रतिनिधि को एक मजबूत संदर्भ रखता है या सत्र को स्पष्ट रूप से अमान्य करता है। यदि आप सत्र को अमान्य नहीं करते हैं, तो आपके एप लीक की स्मृति तब तक याद नहीं रखता है

अपनी परियोजना को देखने के लिए https://github.com/upyun/swift-sdk/tree/testleak आपको sessionTask.resume () के बाद फिनिशTasks औरInvalidate () को कॉल करने की आवश्यकता है क्योंकि आप प्रति अनुरोध सत्र बना रहे हैं





nsurlsessiondatatask