ios 使用中间代理,打破系统自带的strongdelegate的循环引用
来源:互联网 发布:python编写桌面程序 编辑:程序博客网 时间:2024/06/06 06:53
由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.delegaterespondsToSelector:@selector(animationDidStop)]) {
[self.delegateanimationDidStop];
}
}
@end
```
染后使用时
```
JRAnimDelegate *animDelegate = [[JRAnimDelegatealloc] init];
animDelegate.delegate =self;
animation.delegate = animDelegate;
```
转化之后,会打破循环引用。在新的类中将代理转回来,这样也可以使用,这样虽然会使逻辑变的复杂,但是能保证一定是动画执行完成之后调用
两种方法我都测试过,都可以用,具体用哪种 ,每个人都有自己的理解和使用的场景。诸君自便
- ios 使用中间代理,打破系统自带的strongdelegate的循环引用
- iOS系统自带地位的使用
- 使用ios系统自带的MapKit framework进行定位
- iOS使用系统自带的请求方式方法介绍
- iOS系统自带指纹验证的使用
- 如何优雅的打破NSTimer与控制器的循环引用
- iOS 调用系统自带的通讯录
- iOS 获取系统自带的字体
- iOS - 系统自带的分享功能
- iOS 删除系统自带的tabbar
- 使用weak_ptr打破shared_ptr循环引用
- java 自带的代理
- 使用ios自带的socket
- 不使用系统自带的button
- 使用系统自带的委托
- 系统自带ImageLoader的简单使用
- weak_ptr 弱引用打破智能指针中循环引用造成的内存泄露
- ios 系统 自带动画效果使用
- 1- n , n个数的全排列(dfs)
- 中国传统养生思想
- 安卓 购物车 单选反选
- 二维码
- java1.8 常用集合源码学习:LinkedHashMap
- ios 使用中间代理,打破系统自带的strongdelegate的循环引用
- (C语言版)链表(一)——实现单向链表创建、插入、删除等简单操作(包含个人理解说明及注释,新手跟着写代码)
- python内置函数与 javascript对照表
- ReactNaive之CSS和Flex布局
- java1.8 常用集合源码学习:LinkedHashSet
- JVM类加载器
- 【LeetCode】Binary Tree Postorder Traversal 二叉树的后序遍历
- 汽车的3S店4S店
- 使用Python模拟登陆12306并全自动下单