Skip to content

Commit b06988f

Browse files
author
Peyton Randolph
committed
fix retain cycle
1 parent 89d9697 commit b06988f

File tree

4 files changed

+25
-19
lines changed

4 files changed

+25
-19
lines changed

WebViewJavascriptBridgeAbstract/WebViewJavascriptBridgeAbstract.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ typedef void (^WVJBHandler)(id data, WVJBResponseCallback responseCallback);
77

88
@interface WebViewJavascriptBridgeAbstract : NSObject
99

10-
@property (nonatomic, strong) id webView;
11-
@property (nonatomic, strong) id webViewDelegate;
10+
@property (nonatomic, weak) id webView;
11+
@property (nonatomic, weak) id webViewDelegate;
1212
@property (nonatomic, strong) NSMutableArray *startupMessageQueue;
1313
@property (nonatomic, strong) NSMutableDictionary *responseCallbacks;
1414
@property (nonatomic, strong) NSMutableDictionary *messageHandlers;

WebViewJavascriptBridgeAbstract/WebViewJavascriptBridgeAbstract.m

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,21 +79,23 @@ - (void)_dispatchMessage:(NSDictionary *)message {
7979
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"];
8080
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"];
8181
messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\f" withString:@"\\f"];
82+
__strong typeof(self.webView) strongWebView = self.webView;
8283
if ([[NSThread currentThread] isMainThread]) {
83-
[self.webView performSelector:@selector(stringByEvaluatingJavaScriptFromString:)
84+
[strongWebView performSelector:@selector(stringByEvaluatingJavaScriptFromString:)
8485
withObject:[NSString stringWithFormat:
8586
@"WebViewJavascriptBridge._handleMessageFromObjC('%@');", messageJSON]];
8687
} else {
8788
dispatch_sync(dispatch_get_main_queue(), ^{
88-
[self.webView performSelector:@selector(stringByEvaluatingJavaScriptFromString:)
89+
[strongWebView performSelector:@selector(stringByEvaluatingJavaScriptFromString:)
8990
withObject:[NSString stringWithFormat:
9091
@"WebViewJavascriptBridge._handleMessageFromObjC('%@');", messageJSON]];
9192
});
9293
}
9394
}
9495

9596
- (void)_flushMessageQueue {
96-
NSString *messageQueueString = [self.webView performSelector:
97+
__strong typeof(self.webView) strongWebView = self.webView;
98+
NSString *messageQueueString = [strongWebView performSelector:
9799
@selector(stringByEvaluatingJavaScriptFromString:) withObject:@"WebViewJavascriptBridge._fetchQueue();"];
98100

99101
NSArray* messages = [messageQueueString componentsSeparatedByString:kMessageSeparator];
@@ -112,8 +114,8 @@ - (void)_flushMessageQueue {
112114
__block NSString* callbackId = message[@"callbackId"];
113115
if (callbackId) {
114116
responseCallback = ^(id responseData) {
115-
NSDictionary* message = @{ @"responseId":callbackId, @"responseData":responseData };
116-
[self _queueMessage:message];
117+
NSDictionary* msg = @{ @"responseId":callbackId, @"responseData":responseData };
118+
[self _queueMessage:msg];
117119
};
118120
} else {
119121
responseCallback = ^(id ignoreResponseData) {

WebViewJavascriptBridge_iOS/WebViewJavascriptBridge_iOS.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
@interface WebViewJavascriptBridge : WebViewJavascriptBridgeAbstract <UIWebViewDelegate>
55

6-
@property (nonatomic, strong) UIWebView *webView;
7-
@property (nonatomic, strong) id <UIWebViewDelegate> webViewDelegate;
6+
@property (nonatomic, weak) UIWebView *webView;
7+
@property (nonatomic, weak) id <UIWebViewDelegate> webViewDelegate;
88

99
+ (id)bridgeForWebView:(UIWebView*)webView handler:(WVJBHandler)handler;
1010
+ (id)bridgeForWebView:(UIWebView*)webView webViewDelegate:(id <UIWebViewDelegate>)webViewDelegate handler:(WVJBHandler)handler;

WebViewJavascriptBridge_iOS/WebViewJavascriptBridge_iOS.m

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ + (id)bridgeForWebView:(UIWebView *)webView webViewDelegate:(id<UIWebViewDelegat
2424
- (void)webViewDidFinishLoad:(UIWebView *)webView {
2525
if (webView != self.webView) { return; }
2626

27-
if (![[self.webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) {
27+
if (![[webView stringByEvaluatingJavaScriptFromString:@"typeof WebViewJavascriptBridge == 'object'"] isEqualToString:@"true"]) {
2828
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"WebViewJavascriptBridge.js" ofType:@"txt"];
2929
NSString *js = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
30-
[self.webView stringByEvaluatingJavaScriptFromString:js];
30+
[webView stringByEvaluatingJavaScriptFromString:js];
3131
}
3232

3333
if (self.startupMessageQueue) {
@@ -37,39 +37,43 @@ - (void)webViewDidFinishLoad:(UIWebView *)webView {
3737
self.startupMessageQueue = nil;
3838
}
3939

40-
if (self.webViewDelegate && [self.webViewDelegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
41-
[self.webViewDelegate webViewDidFinishLoad:webView];
40+
__strong typeof(self.webViewDelegate) strongDelegate = self.webViewDelegate;
41+
if (strongDelegate && [strongDelegate respondsToSelector:@selector(webViewDidFinishLoad:)]) {
42+
[strongDelegate webViewDidFinishLoad:webView];
4243
}
4344
}
4445

4546
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
4647
if (webView != self.webView) { return; }
47-
if (self.webViewDelegate && [self.webViewDelegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
48-
[self.webViewDelegate webView:self.webView didFailLoadWithError:error];
48+
__strong typeof(self.webViewDelegate) strongDelegate = self.webViewDelegate;
49+
if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
50+
[strongDelegate webView:webView didFailLoadWithError:error];
4951
}
5052
}
5153

5254
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
5355
if (webView != self.webView) { return YES; }
5456
NSURL *url = [request URL];
57+
__strong typeof(self.webViewDelegate) strongDelegate = self.webViewDelegate;
5558
if ([[url scheme] isEqualToString:kCustomProtocolScheme]) {
5659
if ([[url host] isEqualToString:kQueueHasMessage]) {
5760
[self _flushMessageQueue];
5861
} else {
5962
NSLog(@"WebViewJavascriptBridge: WARNING: Received unknown WebViewJavascriptBridge command %@://%@", kCustomProtocolScheme, [url path]);
6063
}
6164
return NO;
62-
} else if (self.webViewDelegate && [self.webViewDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
63-
return [self.webViewDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
65+
} else if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:shouldStartLoadWithRequest:navigationType:)]) {
66+
return [strongDelegate webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
6467
} else {
6568
return YES;
6669
}
6770
}
6871

6972
- (void)webViewDidStartLoad:(UIWebView *)webView {
7073
if (webView != self.webView) { return; }
71-
if (self.webViewDelegate && [self.webViewDelegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
72-
[self.webViewDelegate webViewDidStartLoad:webView];
74+
__strong typeof(self.webViewDelegate) strongDelegate = self.webViewDelegate;
75+
if (strongDelegate && [strongDelegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
76+
[strongDelegate webViewDidStartLoad:webView];
7377
}
7478
}
7579

0 commit comments

Comments
 (0)