2015-01-12 75 views
2

創建一個巨大的分配我試圖動畫的UIImageCAKeyframeAnimation數組的動畫。理論上很簡單。
帖子底部的示例代碼。CAKeyframeAnimation - 動畫的圖像數組創建後完成

我的問題是,動畫完成後,我有一個巨大的泄漏,不可能擺脫它。

代碼以初始化CAKeyframeAnimation

- (void)animateImages 
{ 
    CAKeyframeAnimation *keyframeAnimation = [CAKeyframeAnimation animationWithKeyPath:@"contents"]; 
    keyframeAnimation.values = self.imagesArray; // array with images 

    keyframeAnimation.repeatCount = 1.0f; 
    keyframeAnimation.duration = 5.0; 

    keyframeAnimation.removedOnCompletion = YES; 

    CALayer *layer = self.animationImageView.layer; 

    [layer addAnimation:keyframeAnimation 
      forKey:@"flingAnimation"]; 
} 

添加委託到動畫和去除動畫手動引起同樣的泄漏的效果:

... // Code to change 

keyframeAnimation.delegate = self; 

// keyframeAnimation.removedOnCompletion = YES; 
keyframeAnimation.removedOnCompletion = NO; 
keyframeAnimation.fillMode = kCAFillModeForwards; 

.... 

然後:

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag 
{ 
    if (flag) 
    { 
     [self.animationImageView.layer removeAllAnimations]; 
     [self.animationImageView.layer removeAnimationForKey:@"flingAnimation"]; // just in case 
    } 
} 

結果是a佔據巨大的份額。的存儲器堆的大小正比於圖像的大小:

enter image description here

I uploaded an example to GitHub to check the code.

+0

我運行儀器,沒有泄漏,但分配很高。 – gabbler

+0

你有什麼想法如何解決高配置? –

+0

改爲使用'imageWithContentsOfFile'。 – gabbler

回答

3

解決

我發現這個問題。因爲gabbler是說沒有泄漏問題。問題是圖像的高分配。

我正在釋放帶有圖像的數組,但是圖像沒有從內存中消失。

所以最後我發現這個問題:

[UIImage imageNamed:@""]; 

從方法的定義:

This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method locates and loads the image data from disk or asset catelog, and then returns the resulting object. You can not assume that this method is thread safe.

所以,imageNamed:存儲在私有緩存圖像。
- 第一個問題是您無法控制緩存大小。
- 第二個問題是緩存沒有及時清理,如果您使用imageNamed:分配大量圖像,您的應用可能會崩潰。

SOLUTION

直接從包分配圖片:

NSString *imageName = [NSString stringWithFormat:@"imageName.png"]; 
NSString *path = [[NSBundle mainBundle] pathForResource:imageName 

// Allocating images with imageWithContentsOfFile makes images to do not cache. 
UIImage *image = [UIImage imageWithContentsOfFile:path]; 

小問題:在Images.xcassets

形象得到從未被分配過。因此,將您的圖像移到Images.xcassets之外直接從Bundle進行分配。

Example project with solution here.

+0

添加300張圖片,你的解決方案也不行:D –

+0

300張圖片!更好地考慮使用視頻。 –

+0

但是我不能使用視頻,因爲我需要通過添加CALayer並放置CAKeyframeAnimation來將視頻圖像放在AVMutableVideoComposition的幫助下。 (因爲使用視頻不會有像PNG圖像一樣的alpha)。 如果我必須在用戶界面上顯示動畫,但在我的情況下,我需要將動畫保存到視頻上,那麼對於使用視頻的建議是很好的.. 在此先感謝您的幫助:) –