मैं स्मृति मेरी कोड में लीक के साथ एक समस्या हो रहा है, मैं प्रत्येक के लिए पिछले प्राप्त करने का परिणाम से प्रभावित होता है जल्दी जल्दी में कई यूआरएल पाने के लिए एक की जरूरत है,। इसका उद्देश्य प्रतिक्रिया के भीतर सामग्री के एक विशिष्ट टुकड़े को देखना है।रिकर्सिव/Iterative NSURLSessionDataTask के कारण स्मृति रिसाव
मुझे यह लागू करने का सबसे साफ तरीका मिल गया है, क्योंकि मैं वही विधि का उपयोग कर सकता हूं ताकि यह सत्यापित किया जा सके कि वांछित मूल्य प्रतिक्रिया में मौजूद है या नहीं। कार्यात्मक रूप से यह बहुत अच्छी तरह से काम करता है, लेकिन नीचे वर्णित अनुसार यह स्मृति को रिसाव करता है। मैंने एक ही कार्यक्षमता को एक पुनरावृत्ति फैशन में भी कार्यान्वित किया है, और यह स्मृति को भी रिसाव करता है।
मेरे दिमाग में ऐसा लगता है कि NSURLSession
एपीआई इस स्मृति को लीक करने के लिए ज़िम्मेदार है, और यह तब होता है जब बहुत जल्दी उत्तराधिकार में एकाधिक कॉल किए जाते हैं। हालांकि, अगर मैं कोई भी स्पष्ट गलतियों को इंगित कर सकता हूं तो मैं सराहना करता हूं।
अद्यतन 10/09/14:
एक प्रत्यावर्तन काउंटर जोड़ने के लिए, प्रदर्शन भले ही कोड के समय की एक अनंत संख्या निष्पादित नहीं है रिसाव अब भी होता अपडेट किया गया। दृश्य नियंत्रक के भीतर गुणों के रूप में NSURLSession
और NSURLSessionConfiguration
का पुन: उपयोग करने के लिए थोड़ा सा कार्यान्वयन भी किया गया।
नमूना कोड:
- (void)performURLCallRecursive {
recursionLimiter++;
if (recursionLimiter > 10) {
[self.session finishTasksAndInvalidate];
return;
}
NSURL * checkURL = [NSURL URLWithString:@"http://www.google.com"];
__block NSMutableURLRequest * urlRequest = [[NSMutableURLRequest alloc] initWithURL:checkURL
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:0.0f];
__weak typeof(self) weakSelf = self;
NSURLSessionDataTask * task = [self.session dataTaskWithRequest:urlRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError
*error) {
NSString * body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Body: %@", body);
[weakSelf performURLCallRecursive];
}];
[task resume];
}
#pragma mark - Getters
- (NSURLSessionConfiguration *)sessionConfiguration {
if (!_sessionConfiguration) {
_sessionConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
[_sessionConfiguration setAllowsCellularAccess:NO];
[_sessionConfiguration setTimeoutIntervalForRequest:10.0f];
[_sessionConfiguration setTimeoutIntervalForResource:10.0f];
[_sessionConfiguration setURLCache:[[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]];
}
return _sessionConfiguration;
}
- (NSURLSession *)session {
if (_session == nil) {
_session = [NSURLSession sessionWithConfiguration:self.sessionConfiguration
delegate:[SPRSessionDelegate new]
delegateQueue:nil];
}
return _session;
}
मेमोरी लीक के रूप में उपकरणों के द्वारा की सूचना दी। (ध्यान दें: ये थोड़ा हर बार अलग-अलग हो, लेकिन अधिकांश भाग के लिए बस और अधिक या कम एक ही लीक एक ही लीक होते हैं,):
इसके अलावा अद्यतन: तो
, मैं वास्तव में वास्तव में एक ही कोड लागू किया, और स्मृति रिसाव अभी भी होता है। इस उदाहरण के लिए मैंने एक लूप लिमिटर शामिल किया है, इसलिए यह हमेशा के लिए निष्पादित नहीं होता है। क्या कोई मुझे यह जानने में मदद कर सकता है कि पृथ्वी पर क्या चल रहा है?
- (void)performURLCallIterative
{
int loopLimiter = 0;
do {
NSURLSessionConfiguration * defaultSession = [NSURLSessionConfiguration defaultSessionConfiguration];
[defaultSession setAllowsCellularAccess:NO];
[defaultSession setTimeoutIntervalForRequest:10.0f];
[defaultSession setTimeoutIntervalForResource:10.0f];
NSURLSession * session = [NSURLSession sessionWithConfiguration:defaultSession
delegate:self
delegateQueue:nil];
NSURL * checkURL = [NSURL URLWithString:@"http://google.com"];
NSMutableURLRequest * urlRequest = [[NSMutableURLRequest alloc] initWithURL:checkURL
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:0.0f];
__weak NSURLSession * weakSession = session;
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSessionDataTask * task = [session dataTaskWithRequest:urlRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSString * body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"Body: %@", body);
dispatch_semaphore_signal(semaphore);
[weakSession invalidateAndCancel];
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
loopLimiter++;
} while (loopLimiter <= 6);
}
अद्यतन 10/09/14:
यह अभी तक किसी भी Googlers के जो उनके रास्ते यहां पाया हो सकता है के लिए आईओएस 8 पर हो रहा है। जहां तक मुझे चिंतित है यह आईओएस में एक बग है।
क्या आप एआरसी या एमआरसी का उपयोग करते हैं? –
प्रोजेक्ट एआरसी – Sammio2
का उपयोग करता है क्या यह वास्तव में आईओएस 8 पर हल किया गया था? मुझे बिल्कुल वही समस्या है। क्या यह अब आपके लिए काम कर रहा है? –