में HTTP पर छवियों को लाने के दौरान लगातार स्मृति आवंटन बढ़ रहा है, मैं एक आईओएस ऐप लागू कर रहा हूं जिसे HTTP पर बड़ी मात्रा में छवियां लाने की आवश्यकता है। मैंने कई दृष्टिकोणों की कोशिश की है लेकिन स्वतंत्र रूप से मैं क्या करता हूं, स्मारक लगातार स्मृति आवंटन में वृद्धि दिखाता है और जब मैं इसे किसी डिवाइस पर चलाता हूं तो ऐप क्रैश हो जाता है। उपकरण द्वारा दिखाए गए कोई रिसाव नहीं हैं।आईओएस
अब तक मैं कोशिश की है निम्नलिखित approches:
- एक NSOperation
- भीतर एक तुल्यकालिक NSURLConnection का उपयोग कर छवियां प्राप्त एक NSOperation
- के भीतर एक अतुल्यकालिक NSURLConnection का उपयोग कर छवियों में लाएं का उपयोग छवियों में प्राप्त करें [ NSData डेटा WithContentsOfURL: url] मुख्य-थ्रेड
- एनएसओपरेशन
- में सिंक्रोनस ASIHTTPRequest का उपयोग करके छवियां प्राप्त करें अतुल्यकालिक ASIHTTPRequest का उपयोग कर और एक NSOperationQueue
- में जोड़ने छवियों अतुल्यकालिक ASIHTTPRequest का उपयोग कर और एक completionBlock
instrumetns में कॉल ट्री पता चलता है कि स्मृति सेवन किया जाता है HTTP-प्रतिक्रिया को संसाधित करते समय का उपयोग कर छवियां प्राप्त करें। अतुल्यकालिक NSURLConnection के मामले में यह
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[receivedData appendData:data];
}
तुल्यकालिक NSURLConnection के मामले में में, उपकरण एक बढ़ती CFData (स्टोर) प्रविष्टि से पता चलता है। ASIHTTPRequest के साथ समस्या एक समान कोड-स्थिति में एसिंक्रोनस NSURLConnection के समान ही प्रतीत होती है। [NSData डेटा WithContentsOfURL: url] दृष्टिकोण सटीक रूप से उस कथन में कुल स्मृति आवंटन की बढ़ती मात्रा दिखाता है।
जब मैं एक अलग थ्रेड में अनुरोध किया जाता है तो मैं एक NSAutoReleasePool का उपयोग कर रहा हूं और मैंने [[NSURLCache sharedURLCache] removeAllCachedResponses को हटाएं] - कोई सफलता नहीं है।
समस्या को हल करने के लिए कोई विचार/संकेत? धन्यवाद।
संपादित करें: व्यवहार केवल तब दिखाता है जब मैं CoreData का उपयोग कर छवियों को जारी रखता हूं।
-(void) _fetchAndSave:(NSString*) imageId {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *url = [NSString stringWithFormat:@"%@%@", kImageUrl, imageId];
HTTPResponse *response = [SimpleHTTPClient GET:url headerOrNil:nil];
NSData *data = [response payload];
if(data && [data length] > 0) {
UIImage *thumbnailImage = [UIImage imageWithData:data];
NSData *thumbnailData = UIImageJPEGRepresentation([thumbnailImage scaleToSize:CGSizeMake(55, 53)], 0.5); // UIImagePNGRepresentation(thumbnail);
[self performSelectorOnMainThread:@selector(_save:) withObject:[NSArray arrayWithObjects:imageId, data, thumbnailData, nil] waitUntilDone:NO];
}
[pool release];
}
सभी CoreData संबंधित सामग्री यहां मुख्य-थ्रेड में किया जाता है, इसलिए वहाँ किसी भी CoreData बहु सूत्रण मुद्दा नहीं होना चाहिए: यहाँ कोड मैं एक NSInvocationOperation के रूप में चलाया जाता है। हालांकि, अगर मैं छवियों को जारी रखता हूं, तो उपकरण ऊपर वर्णित पदों पर निरंतर स्मृति आवंटन को दिखाता है।
द्वितीय संपादित करें:
CoreData संबंधित कोड:
-(void) _save:(NSArray*)args {
NSString *imageId = [args objectAtIndex:0];
NSData *data = [args objectAtIndex:1];
NSData *thumbnailData = [args objectAtIndex:2];
Image *image = (Image*)[[CoreDataHelper sharedSingleton] createObject:@Image];
image.timestamp = [NSNumber numberWithDouble:[[NSDate date] timeIntervalSince1970]];
image.data = data;
Thumbnail *thumbnail = (Thumbnail*)[[CoreDataHelper sharedSingleton] createObject:@"Thumbnail"];
thumbnail.data = thumbnailData;
thumbnail.timestamp = image.timestamp;
[[CoreDataHelper sharedSingleton] save];
}
CoreDataHelper (self.managedObjectContext NSManagedObjectContext वर्तमान सूत्र में प्रयोग करने योग्य उठा रहा है) से:
-(NSManagedObject *) createObject:(NSString *) entityName {
return [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.managedObjectContext];
}
क्या आप समस्या को [छोटे कोड नमूना] (http://sscce.org/) के साथ पुन: पेश कर सकते हैं और पोस्ट कर सकते हैं? – zoul
मैं नहीं कर सका! Altough Instruments उल्लिखित स्थानों में स्मृति को बढ़ाना दिखाता है, व्यवहार केवल तब दिखाता है जब मैं CoreData का उपयोग कर छवियों को कैश करता हूं। – sink12
क्या आपको स्मृति की निरंतर वृद्धि का कारण मिला? –