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;

 

```

 

转化之后,会打破循环引用。在新的类中将代理转回来,这样也可以使用,这样虽然会使逻辑变的复杂,但是能保证一定是动画执行完成之后调用

 

两种方法我都测试过,都可以用,具体用哪种 ,每个人都有自己的理解和使用的场景。诸君自便

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值