@@ -269,22 +269,24 @@ - (void)displayLinkDidRefresh:(id)displayLink {
269
269
270
270
#if SD_MAC
271
271
static CVReturn DisplayLinkCallback (CVDisplayLinkRef displayLink, const CVTimeStamp *inNow, const CVTimeStamp *inOutputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext) {
272
- // CVDisplayLink callback is not on main queue
273
- // Actually `SDWeakProxy` but not `SDDisplayLink`
274
- SDDisplayLink *object = (__bridge SDDisplayLink *)displayLinkContext;
275
- if (!object) return kCVReturnSuccess ;
276
- // CVDisplayLink does not use runloop, but we can provide similar behavior for modes
277
- // May use `default` runloop to avoid extra callback when in `eventTracking` (mouse drag, scroll) or `modalPanel` (modal panel)
278
- NSString *runloopMode = object.runloopMode ;
279
- if (![runloopMode isEqualToString: NSRunLoopCommonModes ] && ![runloopMode isEqualToString: NSRunLoop .mainRunLoop.currentMode]) {
272
+ @autoreleasepool {
273
+ // CVDisplayLink callback is not on main queue
274
+ // Actually `SDWeakProxy` but not `SDDisplayLink`
275
+ SDDisplayLink *object = (__bridge SDDisplayLink *)displayLinkContext;
276
+ if (!object) return kCVReturnSuccess ;
277
+ // CVDisplayLink does not use runloop, but we can provide similar behavior for modes
278
+ // May use `default` runloop to avoid extra callback when in `eventTracking` (mouse drag, scroll) or `modalPanel` (modal panel)
279
+ NSString *runloopMode = object.runloopMode ;
280
+ if (![runloopMode isEqualToString: NSRunLoopCommonModes ] && ![runloopMode isEqualToString: NSRunLoop .mainRunLoop.currentMode]) {
281
+ return kCVReturnSuccess ;
282
+ }
283
+ CVTimeStamp outputTime = inOutputTime ? *inOutputTime : *inNow;
284
+ // `SDWeakProxy` is weak, so it's safe to dispatch to main queue without leak
285
+ dispatch_async (dispatch_get_main_queue (), ^{
286
+ object.outputTime = outputTime;
287
+ [object displayLinkDidRefresh: (__bridge id )(displayLink)];
288
+ });
280
289
return kCVReturnSuccess ;
281
290
}
282
- CVTimeStamp outputTime = inOutputTime ? *inOutputTime : *inNow;
283
- // `SDWeakProxy` is weak, so it's safe to dispatch to main queue without leak
284
- dispatch_async (dispatch_get_main_queue (), ^{
285
- object.outputTime = outputTime;
286
- [object displayLinkDidRefresh: (__bridge id )(displayLink)];
287
- });
288
- return kCVReturnSuccess ;
289
291
}
290
292
#endif
0 commit comments