NSURL सत्र स्मृति रिसाव [ios]


Answers

ध्यान दें कि आईओएस 9 पर सुरक्षा फ्रेमवर्क ऐपक्स को आवंटित करता है। 4 के एसएसएल कैश डेटा और आपके ऐप को पहली बार जब आप एक नया NSURLSession ऑब्जेक्ट के लिए कार्य फिर से शुरू करते हैं तो उसे शुल्क लेते हैं। ऐप्पल टेक्निकल क्यू एंड ए QA1727 हमें बताता है कि यह एसएसएल कैश 10 मिनट तक बनी रहती है, चाहे जो भी हो, क्योंकि यह निजी और पूरी तरह से सिस्टम द्वारा प्रबंधित है (क्योंकि सुरक्षा!)।

आपके कोड के उदाहरण में, जब भी आप कोई अनुरोध करते हैं तो आप एक नया NSURLSession ऑब्जेक्ट बना रहे हैं। लेकिन आप केवल डिफ़ॉल्ट सत्र संयोजन का उपयोग कर रहे हैं और एक प्रतिनिधि को निर्दिष्ट नहीं करने के लिए जो एक मजबूत संदर्भ मौजूद हो सकता है, तो आपको इसके बजाय क्या करना चाहिए, केवल सिंगलटन [NSURLSession sharedSession] का उपयोग करें और गैर-सुरक्षा आवंटन को खाली करने के लिए resetWithCompletionHandler का उपयोग करें। या यदि आप कॉन्फ़िगरेशन को कस्टमाइज़ करना चाहते हैं, तो कस्टम सिंगलटन बनाएं।

  • (NSURL सत्र *) साझा सत्र चर्चा

मूलभूत अनुरोधों के लिए, यूआरएल सत्र वर्ग साझा सिंगलटन सत्र ऑब्जेक्ट प्रदान करता है जो आपको उचित डिफॉल्ट व्यवहार देता है साझा किए गए सत्र का उपयोग करके, आप किसी URL की सामग्री मेमोरी में लाने के लिए कोड की कुछ पंक्तियां प्राप्त कर सकते हैं।

अन्य सत्र प्रकारों के विपरीत, आप साझा सत्र नहीं बनाते हैं; आप केवल [NSURL सत्र साझा सत्र] को कॉल करके इसका अनुरोध करते हैं। नतीजतन, आप एक प्रतिनिधि या कॉन्फ़िगरेशन ऑब्जेक्ट प्रदान नहीं करते हैं। इसलिए, साझा सत्र के साथ:

   - You cannot obtain data incrementally as it arrives from the server.
   - You cannot significantly customize the default connection behavior.
   - Your ability to perform authentication is limited.
   - You cannot perform background downloads or uploads while your app is    
     not running.

साझा किए गए सत्र में साझा किए गए NSURLCache, NSHTTPCookieStorage, और NSURLCredentialStorage ऑब्जेक्ट का उपयोग करता है, एक साझा किए गए कस्टम नेटवर्किंग प्रोटोकॉल सूची का उपयोग करता है (रजिस्टर क्लास के साथ कॉन्फ़िगर किया गया है: और अनर्जस्टर क्लास :), और डिफ़ॉल्ट कॉन्फ़िगरेशन पर आधारित है।

साझा सत्र के साथ काम करते समय, आपको आम तौर पर कैश, कुकी संग्रहण या क्रेडेंशियल संग्रहण को अनुकूलित करना चाहिए (जब तक कि आप पहले ही NSURLConnection के साथ ऐसा नहीं कर रहे हों), क्योंकि एक बहुत ही अच्छा मौका है कि आप अंततः डिफ़ॉल्ट सत्र की क्षमताओं का विकास करेंगे , उस बिंदु पर आपको उन सभी अनुकूलन को फिर से लिखना होगा जो आपके कस्टम यूआरएल सत्रों के साथ काम करता है।

दूसरे शब्दों में, यदि आप कैश, कुकीज, प्रमाणीकरण या कस्टम नेटवर्किंग प्रोटोकॉल के साथ कुछ भी कर रहे हैं, तो आपको शायद डिफ़ॉल्ट सत्र के बजाय एक डिफ़ॉल्ट सत्र का उपयोग करना चाहिए।

(NSURL सत्र श्रेणी संदर्भ से ... इटैलिक्स मेरा; पी)

यदि आप sharedSession ऐप्पल-प्रदान किए गए सिंगलटन का उपयोग नहीं कर रहे हैं, तो आपको कम से कम ऐप्पल से एक क्यू लेनी चाहिए और एक सत्र संपत्ति के साथ अपना सिंगलटन रोल करना चाहिए। एक सत्र का मुद्दा यह है कि यह केवल एक अनुरोध से अधिक समय तक जीने का इरादा है। उनके अस्पष्ट प्रलेखन के बावजूद, तथ्य यह है कि एपल एक सिंगलटन प्रदान करता है, और इसे "सत्र" कहते हैं, यह दर्शाता है कि सत्र ऑब्जेक्ट्स केवल एक ही अनुरोध से अधिक समय तक जीने के लिए होती थीं।

हाँ, आप किसी भी बिंदु पर invalidateAndCancel कर सकते हैं और invalidateAndCancel , लेकिन हर अनुरोध के बाद नहीं, और भले ही प्रत्येक अनुरोध पूरी तरह से अलग सर्वर पर नहीं जा रहा हो (जो कि लगभग कभी मामला नहीं है)। यदि आप एक विशेष सत्र के लिए अपने संदर्भ को तोड़ने जा रहे हैं, तो आपको केवल अमान्य और रद्द करने की आवश्यकता है; अन्यथा, आप अपने सत्र के ढेर आवंटन को वीएम में फ्लश करने के लिए या बस हेप और वीएम भंडारण दोनों को साफ करने के लिए रीसेट करने के लिए सत्र पर flushWithCompletionHandler या resetWithCompletionHandler को कॉल कर सकते हैं। ( यहां मेरा उत्तर भी देखें।)

Question

यहां तक ​​कि एक NSURL सत्र को रद्द करने के बाद भी, यंत्रों का उपयोग कर एक प्रोफ़ाइल चलाना, कुछ वर्गों (संभवत: निजी), जो कि ट्यूबमैनेजर, HTTPConnectionCache और HTTPConnectionCacheDictionary अभी भी स्मृति में जीवित हैं।

पुन: उत्पन्न करने के लिए कोड स्निपेट:

NSURLSessionConfiguration* config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession* session = [NSURLSession sessionWithConfiguration:config];
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]];
NSURLSessionDataTask* sessionDataTask = [session dataTaskWithRequest:request
                                               completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    [session finishTasksAndInvalidate];
}];
[sessionDataTask resume];