ios 使用中間代理,打破系統自帶的strongdelegate的迴圈引用
由a ->strong->b , b->strong->a迴圈引用。 改為a->strong->b, b->strong->c ,c->assign->a(同時,c又有b的代理方法等)即可打破迴圈.
在自定義動畫的時候,CABasicAnimation用的還算的蠻多的。
在此先介紹一下CABasicAnimation怎麼使用。
屬性介紹
屬性 | 說明 |
duration | 動畫執行的時長 |
repeatCount | 重複的次數。一直重複設定為 HUGE_VALF |
repeatDuration | 設定動畫的時間。在該時間內動畫一直執行,不計次數 |
beginTime | 指定動畫開始的時間。可以通過(當前時間+秒數)來實現延遲動畫 |
timingFunction | 設定動畫的速度的變化 |
autoreverses | 動畫結束時是否執行逆動畫 |
fromValue | 所改變屬性的起始值 |
toValue | 所改變屬性的結束值 |
byValue | 所改變屬性相同起始值的改變數 |
怎麼使用就不用說了,在這裡主要說一下CABasicAnimation的代理使用方法。
有同學要問了,怎麼一個代理還要注意,我只說一點,他的代理是strong。
這裡就要看看了
anim是新增到layer上的,layer屬於view,view屬於control,anim又持有control,必然出現迴圈引用。
廢話不多說,下面是解決方法。
第一種:
第一種是取巧的方法,不用代理了,既然動畫是自己寫的,動畫時長也是知道的,
乾脆直接使用 ```[self performSelector:@selector(animationDidStop) withObject:self afterDelay:time];```
在time秒之後呼叫,模仿動畫完成之後呼叫。
這樣就有個問題,萬一由於某種原因導致time秒「前後」執行完了,邏輯就會出現瑕疵,不夠完美。
第二種:
第二種方法是建立一個新的類,假設是JRAnimDelegate;
```
.h
#import <Foundation/Foundation.h>
@class JRAnimDelegatel;
@protocol JRAnimDelegateDelegate <NSObject>
@optional
- (void)animationDidStop;
@end
@interface JRAnimDelegate : NSObject<CAAnimationDelegate>
@property(nonatomic, assign) id<JRAnimDelegateDelegate> delegate;
@end
.m
#import "JRAnimDelegate.h"
@implementation JRAnimDelegate
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
if ([self.delegate respondsToSelector:@selector(animationDidStop)]) {
[self.delegate animationDidStop];
}
}
@end
```
染後使用時
```
JRAnimDelegate *animDelegate = [[JRAnimDelegate alloc] init];
animDelegate.delegate = self;
animation.delegate = animDelegate;
```
轉化之後,會打破迴圈引用。在新的類中將代理轉回來,這樣也可以使用,這樣雖然會使邏輯變的複雜,但是能保證一定是動畫執行完成之後呼叫
兩種方法我都測試過,都可以用,具體用哪種 ,每個人都有自己的理解和使用的場景。諸君自便