Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit fd9a079

Browse files
authored
[iOS] Fixes DisplayLinkManager leaks (#22194)
1 parent 5cf3eae commit fd9a079

File tree

3 files changed

+10
-28
lines changed

3 files changed

+10
-28
lines changed

shell/platform/darwin/ios/framework/Source/FlutterEngine.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ - (BOOL)createShell:(NSString*)entrypoint
635635
}
636636

637637
- (void)initializeDisplays {
638-
double refresh_rate = [[[DisplayLinkManager alloc] init] displayRefreshRate];
638+
double refresh_rate = [DisplayLinkManager displayRefreshRate];
639639
auto display = flutter::Display(refresh_rate);
640640
_shell->OnDisplayUpdates(flutter::DisplayUpdateType::kStartup, {display});
641641
}

shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212

1313
@interface DisplayLinkManager : NSObject
1414

15-
- (instancetype)init;
16-
1715
//------------------------------------------------------------------------------
1816
/// @brief The display refresh rate used for reporting purposes. The engine does not care
1917
/// about this for frame scheduling. It is only used by tools for instrumentation. The
@@ -23,7 +21,7 @@
2321
///
2422
/// @return The refresh rate in frames per second.
2523
///
26-
- (double)displayRefreshRate;
24+
+ (double)displayRefreshRate;
2725

2826
@end
2927

shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.mm

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -91,26 +91,16 @@ - (void)dealloc {
9191

9292
@end
9393

94-
@implementation DisplayLinkManager {
95-
fml::scoped_nsobject<CADisplayLink> display_link_;
96-
}
97-
98-
- (instancetype)init {
99-
self = [super init];
100-
101-
if (self) {
102-
display_link_ = fml::scoped_nsobject<CADisplayLink> {
103-
[[CADisplayLink displayLinkWithTarget:self selector:@selector(onDisplayLink:)] retain]
104-
};
105-
display_link_.get().paused = YES;
106-
}
94+
@implementation DisplayLinkManager
10795

108-
return self;
109-
}
110-
111-
- (double)displayRefreshRate {
96+
+ (double)displayRefreshRate {
11297
if (@available(iOS 10.3, *)) {
113-
auto preferredFPS = display_link_.get().preferredFramesPerSecond; // iOS 10.0
98+
fml::scoped_nsobject<CADisplayLink> display_link = fml::scoped_nsobject<CADisplayLink> {
99+
[[CADisplayLink displayLinkWithTarget:[[DisplayLinkManager new] autorelease]
100+
selector:@selector(onDisplayLink:)] retain]
101+
};
102+
display_link.get().paused = YES;
103+
auto preferredFPS = display_link.get().preferredFramesPerSecond; // iOS 10.0
114104

115105
// From Docs:
116106
// The default value for preferredFramesPerSecond is 0. When this value is 0, the preferred
@@ -131,10 +121,4 @@ - (void)onDisplayLink:(CADisplayLink*)link {
131121
// no-op.
132122
}
133123

134-
- (void)dealloc {
135-
[display_link_.get() invalidate];
136-
137-
[super dealloc];
138-
}
139-
140124
@end

0 commit comments

Comments
 (0)