在使用核心動(dòng)畫代理的時(shí)候出現(xiàn)內(nèi)存泄露,主要是因?yàn)閐elegate 是strong修飾的導(dǎo)致循環(huán)引用, 釋放不了就內(nèi)存泄漏了,下圖所示:

image.png
通過自定義代理方法可以解決內(nèi)存泄露問題。以下是自定義代理方法的代碼:
#import <UIKit/UIKit.h>
@protocol KKAnimationDelegateDelegate <NSObject>
@optional
//動(dòng)畫結(jié)束
- (void)finishAnimation;
//動(dòng)畫開始
- (void)startAnimation;
@end
@interface KKAnimationDelegate : NSObject
@property (weak, nonatomic) id<KKAnimationDelegateDelegate> delegate;
@end
#import "KKAnimationDelegate.h"
@implementation KKAnimationDelegate
- (void)animationDidStart:(CAAnimation *)anim {
if (_delegate && [_delegate respondsToSelector:@selector(startAnimation)]) {
[_delegate startAnimation];
}
}
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
if (_delegate && [_delegate respondsToSelector:@selector(finishAnimation)]) {
[_delegate finishAnimation];
}
}
- (void)dealloc {
NSLog(@"Delegate Dealloc");
}
@end
使用自定義代理代碼
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
anim.fillMode = kCAFillModeForwards;
KKAnimationDelegate *animationDelegate = [[KKAnimationDelegate alloc] init];
animationDelegate.delegate = self;
[anim setDelegate:animationDelegate];
[anim setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[_imgView.layer addAnimation:anim forKey:@"rotation"];
//防止CABasicAnimation 按home鍵切到后臺(tái)之后,再按home鍵回來動(dòng)畫就停止了
anim.removedOnCompletion = NO;