मेरे पास एक एआरसी आधारित ऐप है जो एक webservice से लगभग 2,000 काफी बड़ी (1-4 एमबी) बेस 64 एन्कोडेड छवियों को लोड करता है। यह बेस 64 डीकोडेड तारों को .png
छवि फ़ाइलों में परिवर्तित करता है और उन्हें डिस्क पर सहेजता है। यह सब एक लूप में किया गया है जहां मुझे कोई भी संदर्भ नहीं होना चाहिए।उद्देश्य सी UIImagePNGRepresentation स्मृति समस्या (एआरसी का उपयोग करके)
मैंने अपना ऐप प्रोफाइल किया और पाया कि UIImagePNGRresentresentेशन लगभग 50% उपलब्ध स्मृति को हॉगिंग कर रहा था।
जिस तरह से मैं इसे देखता हूं, UIImagePNGRepresentation यह छवियों को कैशिंग कर रहा है। इसे ठीक करने का एक तरीका उस कैश को फ्लश करना होगा। कोई विचार है कि कोई ऐसा कैसे कर सकता है?
एक और समाधान UIImagePNGRepresentation के अलावा कुछ और उपयोग करना होगा?
मैंने पहले ही कोई भाग्य के साथ यह कोशिश नहीं की: Memory issue in using UIImagePNGRepresentation। उल्लेख नहीं है कि मैं वास्तव में उपलब्ध समाधान का उपयोग नहीं कर सकता क्योंकि यह मेरे ऐप को बहुत धीमा कर देगा।
यह तरीका है जिसे मैं अपने लूप से कॉल करता हूं। UIImage छवि Base64 से परिवर्तित है:
+ (void)saveImage:(UIImage*)image:(NSString*)imageName:(NSString*)directory {
NSData *imageData = UIImagePNGRepresentation(image); //convert image into .png format.
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //create an array and store result of our search for the documents directory in it
NSString *documentsDirectory = [paths objectAtIndex:0]; //create NSString object, that holds our exact path to the documents directory
NSString *pathToFolder = [documentsDirectory stringByAppendingPathComponent:directory];
if (![fileManager fileExistsAtPath:pathToFolder]) {
if(![fileManager createDirectoryAtPath:pathToFolder withIntermediateDirectories:YES attributes:nil error:NULL]) {
// Error handling removed for brevity
}
}
NSString *fullPath = [pathToFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", imageName]]; //add our image to the path
[fileManager createFileAtPath:fullPath contents:imageData attributes:nil]; //finally save the path (image)
// clear memory (this did nothing to improve memory management)
imageData = nil;
fileManager = nil;
}
संपादित करें: छवि आयाम 1000 * 800 से 3000 * 2000 के लिए मोटे तौर पर बदलती हैं।
मैंने ऑटोरेलीपूल की कोशिश की लेकिन इससे मदद नहीं मिली। कुछ कारणों से ऐप क्रैश हो जाता है जब मैं इसे ऑटोरेलीपूल के साथ प्रोफाइल करने का प्रयास करता हूं .. मैं अपने प्रश्न में छवि आयाम जोड़ दूंगा। – JHollanti
मैंने ऑटोरेलीजपूल चीज़ी को अन्य स्थानों के समूह में जोड़ा और पूरी चीज काम करना शुरू कर दिया। यह शुरू करना बहुत आसान होगा अगर मैं अपने ऐप को प्रोफाइल कर सकता था जब इसमें ऑटोरेलीपूल शामिल थे। @vikingosegundo कभी इस प्रोफाइलिंग मुद्दे था कि मैं सामना कर रहा हूँ? – JHollanti
संख्या। लेकिन मैं अक्सर lldb के साथ मुद्दों को डीबगर और प्रोफाइलिंग कर रहा हूं। मैं वापस जीडीबी स्विच किया। – vikingosegundo