5

मैं एक छवि का एनीमेशन का प्रतिनिधित्व करने के लिए एक imageView की परत करने के लिए एक CAKeyframeAnimation जोड़ रहा जारी नहीं करता है:CAKeyframeAnimation निकाला जा रहा है स्मृति

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"]; 
animation.values = arrayOfImages; 
[animation setRemovedOnCompletion:YES]; 
animation.delegate = self; 
[animation setValue:delegate forKey:@"AnimatedImageViewDelegate"]; 
animation.repeatCount = repeatCount; 
animation.fillMode = kCAFillModeForwards; 
animation.calculationMode = kCAAnimationDiscrete; 
[animation setValue:animationName forKey:@"name"]; 

जब मैं एनीमेशन मैं फोन शुरू करना चाहते हैं:

animation.duration = duration; 
[self.layer addAnimation:animation forKey:animationName]; 
[self.layer setContents:[animation.values lastObject]]; 

जब एनीमेशन समाप्त होता है, तो मैं इसे पूरी तरह से हटा देना चाहता हूं और इसकी याददाश्त जारी करना चाहता हूं।

[self.layer removeAllAnimations];  
[self.layer removeAnimationForKey:animationName]; 

ऐसा करने से, और उपकरण-गतिविधि मॉनिटर का उपयोग कर, स्मृति relased नहीं है जब तक कि मैं पूरा imageView छोड़ें।

मैं UIImageView को नष्ट किए बिना उस एनीमेशन मेमोरी को कैसे जारी कर सकता हूं ???

+0

आप इसे autoreleasepool – SAKrisT

उत्तर

0

आप ऑब्जेक्ट को तुरंत चालू करने के लिए सुविधा विधि का उपयोग कर रहे हैं। इसलिए ऑब्जेक्ट वास्तव में रिलीज़ होने पर आपके पास नियंत्रण नहीं होगा। कि इस पर नियंत्रण है के लिए, आप वस्तु alloc और यह अपने आप dealloc करने की आवश्यकता होगी:

CAKeyframeAnimation *animation = [[CAKeyframeAnimation alloc] init]; 

तब के बाद एनीमेशन अपने निकालें लाइनों के बाद कॉल समाप्त:

[animation release]; 
+0

'[CAKeyframeAnimation एनीमेशन WithKeyPath:] 'में एक ऑटोरेलेज्ड ऑब्जेक्ट (नामकरण सम्मेलन के अनुसार) देता है और वह इसे बनाए रखने के लिए प्रतीत नहीं होता है (कम से कम वह उसे प्रस्तुत कोड में नहीं कर रहा है) तो वह ठीक होना चाहिए। इसके बजाय 'alloc/release' करना इसे बदल नहीं देगा। दरअसल, अपने कोड से मैं कहूंगा कि सब कुछ ठीक है इसलिए मुद्दा कहीं और होना चाहिए। – DarkDust

+0

सच है, सिवाय इसके कि, जब इसे स्वत: बंद कर दिया जाता है तो उसका कोई नियंत्रण नहीं होता है। ऐसा लगता है जैसे दृश्य नष्ट हो जाने पर इसे ऑटोरेलेज्ड किया जा रहा है, ऐसा लगता है कि कम से कम कुछ कोशिश करने लायक है। –

+0

एनीमेशन आवंटन/init और रिलीज भी कर रहा है, जब मैं गतिविधि मॉनीटर का उपयोग करता हूं तो स्मृति कम नहीं हो रही है। तो, autorelease या रिलीज का उपयोग कर स्मृति के मामले में कोई फर्क नहीं पड़ता। अगर मैं लाइन एनीमेशन .values ​​= arrayOfImages पर टिप्पणी करता हूं; एनीमेशन दिखाया नहीं जा रहा है और स्मृति में वृद्धि नहीं होती है, इसलिए मेरी समस्या यह है कि जब एनीमेशन खत्म हो जाता है तब तक स्मृति को रिलीज़ नहीं किया जाता है जब तक कि मैं ImageView जारी नहीं करता। – nano

0

इंस्टेंस बनाएं

सबसे पहले, अगर यह एक आईओएस 5 प्रोजेक्ट है तो एआरसी आपके लिए अपनी रिलीज को संभालना चाहिए - जो वास्तव में अच्छा है!

अब - मैंने अपनी परियोजना में बहुत सारे एनिमेशन का उपयोग किया और ढेर में समान विस्फोटों को देखा। मेरा अनुमान है कि सीए आंतरिक रूप से एनिमेटेड है जो बहुत सी कैश करता है। उन वस्तुओं वास्तव में autoreleased किया जा रहा है मैं आवंटन या उपकरणों उपकरण के साथ लीक के लिए एक परीक्षण की स्थापना की सलाह देते हैं और निम्नलिखित है इस बात की पुष्टि करने के लिए:

  1. एक स्थिति है जहाँ आप को ट्रिगर करेगा और एनीमेशन निर्धारित करें।
  2. एनीमेशन पूर्ण होने के बाद ढेर को चिह्नित करें।
  3. कुछ ऐसा ट्रिगर करें जो आपको दूसरे दृश्य में ले जाएगा जहां वस्तुओं को हटा दिया जाना चाहिए था।
  4. प्रक्रिया को 1-2-3 चरणों में जितनी बार चाहें उतनी बार दोहराएं। मैं आमतौर पर इसे लगभग 10 गुना या तो करता हूं।

यह है .. मूल रूप से एनिमेट - मार्क - अंडो - एनिमेट - मार्क। यदि कोरएनीमेशन ऑटोरलेज़िंग ऑब्जेक्ट्स सही तरीके से हो रहा है तो आपको 0 या लगभग 0 की कमी वाले हेपशॉट्स देखना चाहिए!

कैसे इस तरह का परीक्षण करने के लिए इस लेख पर एक नज़र के बारे में अधिक जानकारी के लिए:

http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

+0

आपके उत्तर के लिए धन्यवाद। एनीमेशन खत्म होने के बाद यह लगभग 0 तक घट जाता है लेकिन केवल अगर मैं ImageView जारी करता हूं। इसे जारी किए बिना, ढेर वृद्धि काफी अधिक है (40 केबी से 800 केबी तक हर बार)। इसका मतलब है कि कोरएनीमेशन खत्म होने पर रिलीज़ नहीं हो रहा है। – nano

0

मैं CAKeyframeAnimation साथ स्मृति के बारे में एक ही समस्या है जब सेट मूल्यों = छवियों की सरणी। और मुझे लगता है कि मुझे जो समस्या मिलती है वह यह है कि छवियों को [UIImage imagewithname:] द्वारा संपादित किया जाता है जो डिफ़ॉल्ट रूप से स्मृति में कैश किया जाता है। तो मेरा समाधान उपयोग करने के लिए बदल गया है [UIImage imageWithContentsOfFile:] आशा है कि यह सहायक होगा।

संबंधित मुद्दे