/ / NSURLCache ऑटोरेल्ड ऑब्जेक्ट्स के साथ क्रैश होता है, लेकिन अन्यथा लीक होता है - उद्देश्य-सी, कोको, ऑटोरेलेज़, nsurlcache

NSURLCache autoreleased वस्तुओं के साथ दुर्घटनाग्रस्त हो जाता है, लेकिन अन्यथा लीक - उद्देश्य-सी, कोको, autorelease, nsurlcache

CSURLCache के रूप में ऑफ़लाइन ब्राउज़िंग के लिए संसाधनों को कैश करने के लिए डिज़ाइन किया गया है NSURLCache केवल मेमोरी में डेटा स्टोर करता है।

अगर cachedResponse आवेदन दुर्घटनाओं को वापस करने से पहले ऑटोरेलिज्ड है, यदि नहीं, तो वस्तुओं को बस लीक किया जाता है।

किसी भी प्रकाश कि इस पर बहाया जा सकता है बहुत सराहना की जाएगी।

कृपया ध्यान दें stringByEncodingURLEntities पर एक श्रेणी विधि है NSString.

@interface CSURLCache : NSURLCache {} @end

@implementation CSURLCache

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request
{
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[[[request URL] absoluteString] stringByEncodingURLEntities]];

if ([[NSFileManager defaultManager] fileExistsAtPath:path])
{
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[request URL]
MIMEType:nil
expectedContentLength:[data length]
textEncodingName:nil];

NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response
data:data];
[response release];
[data release];

return cachedResponse;
}

return nil;
}

@end

अद्यतन करें: Apple को राडार सबमिट करने के बाद ऐसा प्रतीत होता है कि यह एक ज्ञात मुद्दा है (रडार # 7640470)।

उत्तर:

उत्तर № 1 के लिए 1
- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request

खैर, यह isn "t a alloc, new, या copy तरीका…

... और CSURLCache कहीं भी वस्तु पर पकड़ नहीं रखता है, इसलिए यह इसका मालिक नहीं है।

तो, आपको इसे ऑटोरेलिज़ करने की आवश्यकता है।

बेशक, इसका मतलब है कि वस्तु तब तक बर्बाद होती है जब तक कि कोई चीज उसे बरकरार नहीं रखती। आपका ऐप क्रैश हो गया क्योंकि उसने ऑब्जेक्ट के मरने के बाद ऑब्जेक्ट का उपयोग करने की कोशिश की।

लाश टेम्पलेट के साथ इंस्ट्रूमेंट के तहत अपना ऐप चलाएं। देखिए कि ऐप कहां क्रैश हुआ और कब क्या कर रहा था cachedResponseForRequest: बुलाया गया था। कॉल करने वाले को उस समय तक ऑब्जेक्ट की आवश्यकता होती है, जब एप्लिकेशन अन्यथा दुर्घटनाग्रस्त हो जाता है, और फिर उसे छोड़ देता है।