一个计时器对象,使任务以与屏幕刷新率相同的频率被执行
使用方法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对象互相强引用,所以不能在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];
引用关系图: