CADisplayLink

一个计时器对象,使任务以与屏幕刷新率相同的频率被执行

使用方法1

@property (nonatomic, strong) CADisplayLink *displayLink;

// 1. 初始化
self.displayLink = [CADisplayLink displayLinkWithTarget:对象 selector:@selector(方法)];

// 2. 加入RunLoop
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

// 3. 移出RunLoop
[self.displayLink invalidate];

引用关系图:

引用
引用
引用
UIViewController
CADisplayLink
NSRunLoop

因为UIViewController对象与CADisplayLink对象互相强引用,所以不能在dealloc中将CADisplayLink移出RunLoop

不要使用下面的代码

- (void)dealloc {
    [self.displayLink invalidate];
}

使用方法2

代理对象:

@interface Proxy : NSProxy

+ (instancetype)proxyWithTarget:(id)target;

@end

@interface Proxy ()

@property (nonatomic, assign) id target;

@end

@implementation Proxy

+ (instancetype)proxyWithTarget:(id)target {
    Proxy *proxy = [self alloc];
    proxy.target = target;
    return proxy;
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
    return [self.target methodSignatureForSelector:sel];
}

- (void)forwardInvocation:(NSInvocation *)invocation {
    [invocation invokeWithTarget:self.target];
}

示例代码:

@property (nonatomic, strong) CADisplayLink *displayLink;

// 1. 初始化
self.displayLink = [CADisplayLink displayLinkWithTarget:[Proxy proxyWithTarget:对象] selector:@selector(方法)];

// 2. 加入RunLoop
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

// 3. 移出RunLoop
[self.displayLink invalidate];

引用关系图:

引用
引用
弱引用
引用
UIViewController
CADisplayLink
Proxy
NSRunLoop
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值