1. 程式人生 > >ios 使用中間代理,打破系統自帶的strongdelegate的迴圈引用

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;

```

轉化之後,會打破迴圈引用。在新的類中將代理轉回來,這樣也可以使用,這樣雖然會使邏輯變的複雜,但是能保證一定是動畫執行完成之後呼叫

兩種方法我都測試過,都可以用,具體用哪種 ,每個人都有自己的理解和使用的場景。諸君自便