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:
बुलाया गया था। कॉल करने वाले को उस समय तक ऑब्जेक्ट की आवश्यकता होती है, जब एप्लिकेशन अन्यथा दुर्घटनाग्रस्त हो जाता है, और फिर उसे छोड़ देता है।