Skip to content

Commit 73c7e26

Browse files
Add autoreleasepool to DisplayLinkCallback to release objects
1 parent 10d06f6 commit 73c7e26

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

SDWebImage/Private/SDDisplayLink.m

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -269,22 +269,24 @@ - (void)displayLinkDidRefresh:(id)displayLink {
269269

270270
#if SD_MAC
271271
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+
});
280289
return kCVReturnSuccess;
281290
}
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;
289291
}
290292
#endif

0 commit comments

Comments
 (0)