Skip to content

Commit e5a6655

Browse files
p-sunfacebook-github-bot
authored andcommitted
iOS: Fix Animated image crash when CADisplayLink target in RCTWeakProxy is nil
Summary: ## Problem When self is nil, this may crash in RCTUIImageViewAnimated.m. ``` _displayLink = [CADisplayLink displayLinkWithTarget:[RCTWeakProxy weakProxyWithTarget:self] selector:selector(displayDidRefresh:)]; ``` ## Fix Replace `RCTWeakProxy` with a concrete class `RCTDisplayWeakRefreshable` that has the displayDidRefresh method, that calls the displayDidRefresh method in its weak target. ### Original Github Issue #28070 (comment) Changelog: [iOS] [Fixed] - Fix Animated image crash when CADisplayLink target in RCTWeakProxy is nil Reviewed By: shergin Differential Revision: D21419385 fbshipit-source-id: da7c3c38f81ea54f633da7f59359e07680ea2faf
1 parent 649e1b7 commit e5a6655

File tree

4 files changed

+87
-36
lines changed

4 files changed

+87
-36
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#import <Foundation/Foundation.h>
9+
10+
@protocol RCTDisplayRefreshable
11+
12+
- (void)displayDidRefresh:(CADisplayLink *)displayLink;
13+
14+
@end
15+
16+
@interface RCTDisplayWeakRefreshable : NSObject
17+
18+
@property (nonatomic, weak) id<RCTDisplayRefreshable> refreshable;
19+
20+
+ (CADisplayLink *)displayLinkWithWeakRefreshable:(id<RCTDisplayRefreshable>)refreshable;
21+
22+
@end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
#import "RCTDisplayWeakRefreshable.h"
9+
10+
@implementation RCTDisplayWeakRefreshable
11+
12+
+ (CADisplayLink *)displayLinkWithWeakRefreshable:(id<RCTDisplayRefreshable>)refreshable {
13+
RCTDisplayWeakRefreshable *target = [[RCTDisplayWeakRefreshable alloc] initWithRefreshable:refreshable];
14+
return [CADisplayLink displayLinkWithTarget:target selector:@selector(displayDidRefresh:)];
15+
}
16+
17+
- (instancetype)initWithRefreshable:(id<RCTDisplayRefreshable>)refreshable
18+
{
19+
if (self = [super init]) {
20+
_refreshable = refreshable;
21+
}
22+
return self;
23+
}
24+
25+
- (void)displayDidRefresh:(CADisplayLink *)displayLink {
26+
[_refreshable displayDidRefresh:displayLink];
27+
}
28+
29+
@end

Libraries/Image/RCTUIImageViewAnimated.m

+3-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
*/
77

88
#import <React/RCTUIImageViewAnimated.h>
9-
#import <React/RCTWeakProxy.h>
9+
#import <React/RCTDisplayWeakRefreshable.h>
1010

1111
#import <mach/mach.h>
1212
#import <objc/runtime.h>
@@ -29,7 +29,7 @@ static NSUInteger RCTDeviceFreeMemory() {
2929
return (vm_stat.free_count - vm_stat.speculative_count) * page_size;
3030
}
3131

32-
@interface RCTUIImageViewAnimated () <CALayerDelegate>
32+
@interface RCTUIImageViewAnimated () <CALayerDelegate, RCTDisplayRefreshable>
3333

3434
@property (nonatomic, assign) NSUInteger maxBufferSize;
3535
@property (nonatomic, strong, readwrite) UIImage *currentFrame;
@@ -153,7 +153,7 @@ - (CADisplayLink *)displayLink
153153
}
154154

155155
if (!_displayLink) {
156-
_displayLink = [CADisplayLink displayLinkWithTarget:[RCTWeakProxy weakProxyWithTarget:self] selector:@selector(displayDidRefresh:)];
156+
_displayLink = [RCTDisplayWeakRefreshable displayLinkWithWeakRefreshable:self];
157157
NSString *runLoopMode = [NSProcessInfo processInfo].activeProcessorCount > 1 ? NSRunLoopCommonModes : NSDefaultRunLoopMode;
158158
[_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:runLoopMode];
159159
}

RNTester/Podfile.lock

+33-33
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ PODS:
1111
- React-Core (= 1000.0.0)
1212
- React-jsi (= 1000.0.0)
1313
- ReactCommon/turbomodule/core (= 1000.0.0)
14-
- Flipper (0.37.0):
14+
- Flipper (0.41.5):
1515
- Flipper-Folly (~> 2.2)
1616
- Flipper-RSocket (~> 1.1)
1717
- Flipper-DoubleConversion (1.1.7)
@@ -25,36 +25,36 @@ PODS:
2525
- Flipper-PeerTalk (0.0.4)
2626
- Flipper-RSocket (1.1.0):
2727
- Flipper-Folly (~> 2.2)
28-
- FlipperKit (0.37.0):
29-
- FlipperKit/Core (= 0.37.0)
30-
- FlipperKit/Core (0.37.0):
31-
- Flipper (~> 0.37.0)
28+
- FlipperKit (0.41.5):
29+
- FlipperKit/Core (= 0.41.5)
30+
- FlipperKit/Core (0.41.5):
31+
- Flipper (~> 0.41.5)
3232
- FlipperKit/CppBridge
3333
- FlipperKit/FBCxxFollyDynamicConvert
3434
- FlipperKit/FBDefines
3535
- FlipperKit/FKPortForwarding
36-
- FlipperKit/CppBridge (0.37.0):
37-
- Flipper (~> 0.37.0)
38-
- FlipperKit/FBCxxFollyDynamicConvert (0.37.0):
36+
- FlipperKit/CppBridge (0.41.5):
37+
- Flipper (~> 0.41.5)
38+
- FlipperKit/FBCxxFollyDynamicConvert (0.41.5):
3939
- Flipper-Folly (~> 2.2)
40-
- FlipperKit/FBDefines (0.37.0)
41-
- FlipperKit/FKPortForwarding (0.37.0):
40+
- FlipperKit/FBDefines (0.41.5)
41+
- FlipperKit/FKPortForwarding (0.41.5):
4242
- CocoaAsyncSocket (~> 7.6)
4343
- Flipper-PeerTalk (~> 0.0.4)
44-
- FlipperKit/FlipperKitHighlightOverlay (0.37.0)
45-
- FlipperKit/FlipperKitLayoutPlugin (0.37.0):
44+
- FlipperKit/FlipperKitHighlightOverlay (0.41.5)
45+
- FlipperKit/FlipperKitLayoutPlugin (0.41.5):
4646
- FlipperKit/Core
4747
- FlipperKit/FlipperKitHighlightOverlay
4848
- FlipperKit/FlipperKitLayoutTextSearchable
4949
- YogaKit (~> 1.18)
50-
- FlipperKit/FlipperKitLayoutTextSearchable (0.37.0)
51-
- FlipperKit/FlipperKitNetworkPlugin (0.37.0):
50+
- FlipperKit/FlipperKitLayoutTextSearchable (0.41.5)
51+
- FlipperKit/FlipperKitNetworkPlugin (0.41.5):
5252
- FlipperKit/Core
53-
- FlipperKit/FlipperKitReactPlugin (0.37.0):
53+
- FlipperKit/FlipperKitReactPlugin (0.41.5):
5454
- FlipperKit/Core
55-
- FlipperKit/FlipperKitUserDefaultsPlugin (0.37.0):
55+
- FlipperKit/FlipperKitUserDefaultsPlugin (0.41.5):
5656
- FlipperKit/Core
57-
- FlipperKit/SKIOSNetworkPlugin (0.37.0):
57+
- FlipperKit/SKIOSNetworkPlugin (0.41.5):
5858
- FlipperKit/Core
5959
- FlipperKit/FlipperKitNetworkPlugin
6060
- Folly (2020.01.13.00):
@@ -346,25 +346,25 @@ DEPENDENCIES:
346346
- DoubleConversion (from `../third-party-podspecs/DoubleConversion.podspec`)
347347
- FBLazyVector (from `../Libraries/FBLazyVector`)
348348
- FBReactNativeSpec (from `../Libraries/FBReactNativeSpec`)
349-
- Flipper (~> 0.37.0)
349+
- Flipper (~> 0.41.1)
350350
- Flipper-DoubleConversion (= 1.1.7)
351351
- Flipper-Folly (~> 2.2)
352352
- Flipper-Glog (= 0.3.6)
353353
- Flipper-PeerTalk (~> 0.0.4)
354354
- Flipper-RSocket (~> 1.1)
355-
- FlipperKit (~> 0.37.0)
356-
- FlipperKit/Core (~> 0.37.0)
357-
- FlipperKit/CppBridge (~> 0.37.0)
358-
- FlipperKit/FBCxxFollyDynamicConvert (~> 0.37.0)
359-
- FlipperKit/FBDefines (~> 0.37.0)
360-
- FlipperKit/FKPortForwarding (~> 0.37.0)
361-
- FlipperKit/FlipperKitHighlightOverlay (~> 0.37.0)
362-
- FlipperKit/FlipperKitLayoutPlugin (~> 0.37.0)
363-
- FlipperKit/FlipperKitLayoutTextSearchable (~> 0.37.0)
364-
- FlipperKit/FlipperKitNetworkPlugin (~> 0.37.0)
365-
- FlipperKit/FlipperKitReactPlugin (~> 0.37.0)
366-
- FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.37.0)
367-
- FlipperKit/SKIOSNetworkPlugin (~> 0.37.0)
355+
- FlipperKit (~> 0.41.1)
356+
- FlipperKit/Core (~> 0.41.1)
357+
- FlipperKit/CppBridge (~> 0.41.1)
358+
- FlipperKit/FBCxxFollyDynamicConvert (~> 0.41.1)
359+
- FlipperKit/FBDefines (~> 0.41.1)
360+
- FlipperKit/FKPortForwarding (~> 0.41.1)
361+
- FlipperKit/FlipperKitHighlightOverlay (~> 0.41.1)
362+
- FlipperKit/FlipperKitLayoutPlugin (~> 0.41.1)
363+
- FlipperKit/FlipperKitLayoutTextSearchable (~> 0.41.1)
364+
- FlipperKit/FlipperKitNetworkPlugin (~> 0.41.1)
365+
- FlipperKit/FlipperKitReactPlugin (~> 0.41.1)
366+
- FlipperKit/FlipperKitUserDefaultsPlugin (~> 0.41.1)
367+
- FlipperKit/SKIOSNetworkPlugin (~> 0.41.1)
368368
- Folly (from `../third-party-podspecs/Folly.podspec`)
369369
- glog (from `../third-party-podspecs/glog.podspec`)
370370
- RCTRequired (from `../Libraries/RCTRequired`)
@@ -480,13 +480,13 @@ SPEC CHECKSUMS:
480480
DoubleConversion: cde416483dac037923206447da6e1454df403714
481481
FBLazyVector: 8ea0285646adaf7fa725c20ed737c49ee5ea680a
482482
FBReactNativeSpec: e8f07c749b9cf184c819f5a8ca44b91ab61fca12
483-
Flipper: 1670db365568191bd123a0c905b834e77ba9e3d3
483+
Flipper: 33585e2d9810fe5528346be33bcf71b37bb7ae13
484484
Flipper-DoubleConversion: 38631e41ef4f9b12861c67d17cb5518d06badc41
485485
Flipper-Folly: c12092ea368353b58e992843a990a3225d4533c3
486486
Flipper-Glog: 1dfd6abf1e922806c52ceb8701a3599a79a200a6
487487
Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
488488
Flipper-RSocket: 64e7431a55835eb953b0bf984ef3b90ae9fdddd7
489-
FlipperKit: afd4259ef9eadeeb2d30250b37d95cb3b6b97a69
489+
FlipperKit: bc68102cd4952a258a23c9c1b316c7bec1fecf83
490490
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
491491
glog: 40a13f7840415b9a77023fbcae0f1e6f43192af3
492492
OpenSSL-Universal: 8b48cc0d10c1b2923617dfe5c178aa9ed2689355

0 commit comments

Comments
 (0)