在动态框架中使用 +load 设置快速 WKNavigationDelegate 是否安全?
Is it safe to use +load in a dynamic framework to set up a quick WKNavigationDelegate?
我正在我的动态框架中设置一个简单的 WKNavigationDelegate
以获取 WKWebView
的默认用户代理字符串:
@interface MyDelegate: NSObject <WKNavigationDelegate>
@end
static NSString *_defaultUserAgent;
static WKWebView *_defaultWebView;
static MyDelegate *_myDelegate;
@implementation MyDelegate
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation {
DispatchHelper.runOnMain = ^{
[_defaultWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id __nullable userAgent, NSError * __nullable error) {
_defaultUserAgent = userAgent;
_defaultWebView = nil;
_myDelegate = nil;
}];
};
}
@end
@implementation WKWebView (Util)
+ (void)load {
_myDelegate = MyDelegate.new;
WKWebView *wkWebView = WKWebView.new;
wkWebView.navigationDelegate = _myDelegate;
[wkWebView loadHTMLString:@"<HTML><BODY>TEST</BODY></HTML>" baseURL:nil];
_defaultWebView = wkWebView;
}
@end
这样做安全吗,还是 +load 太早了,不能尝试这样的事情?在我的测试中,我没有注意到它有任何问题,但在阅读 this Mike Ash blog 之后,他说使用 +load 是 dangerous/tricky.
具体来自博客:
Keep in mind that there's no autorelease pool present at loading time
(usually) so you'll need to wrap your code in one if you're calling
into Objective-C stuff.
我不使用@autoreleasepool 会不会有风险?我对如何添加
感到困惑
+ (void)load {
@autoreleasepool {
_myDelegate = MyDelegate.new;
WKWebView *wkWebView = WKWebView.new;
wkWebView.navigationDelegate = _myDelegate;
[wkWebView loadHTMLString:@"<HTML><BODY>TEST</BODY></HTML>" baseURL:nil];
_defaultWebView = wkWebView;
}
}
在这里帮助我。
+load
充满了危险和脆弱。由于 +load
几十年来的意外,我不得不追踪许多有趣的错误。一般来说,应该避免。并且在使用时,它应该特别接触到系统其余部分的最少部分,因为您将更改在运行时初始化事物的顺序。
我建议您在框架中设置某种初始化挂钩,您的框架的客户端预计会在应用程序中调用,通常是在应用程序委托的 didFinishLaunching:....
方法期间。
您可以将 assert()s
放入其他代码路径中,如果框架未正确初始化,这些代码路径会发出警告或引发错误。
我正在我的动态框架中设置一个简单的 WKNavigationDelegate
以获取 WKWebView
的默认用户代理字符串:
@interface MyDelegate: NSObject <WKNavigationDelegate>
@end
static NSString *_defaultUserAgent;
static WKWebView *_defaultWebView;
static MyDelegate *_myDelegate;
@implementation MyDelegate
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation {
DispatchHelper.runOnMain = ^{
[_defaultWebView evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id __nullable userAgent, NSError * __nullable error) {
_defaultUserAgent = userAgent;
_defaultWebView = nil;
_myDelegate = nil;
}];
};
}
@end
@implementation WKWebView (Util)
+ (void)load {
_myDelegate = MyDelegate.new;
WKWebView *wkWebView = WKWebView.new;
wkWebView.navigationDelegate = _myDelegate;
[wkWebView loadHTMLString:@"<HTML><BODY>TEST</BODY></HTML>" baseURL:nil];
_defaultWebView = wkWebView;
}
@end
这样做安全吗,还是 +load 太早了,不能尝试这样的事情?在我的测试中,我没有注意到它有任何问题,但在阅读 this Mike Ash blog 之后,他说使用 +load 是 dangerous/tricky.
具体来自博客:
Keep in mind that there's no autorelease pool present at loading time (usually) so you'll need to wrap your code in one if you're calling into Objective-C stuff.
我不使用@autoreleasepool 会不会有风险?我对如何添加
感到困惑+ (void)load {
@autoreleasepool {
_myDelegate = MyDelegate.new;
WKWebView *wkWebView = WKWebView.new;
wkWebView.navigationDelegate = _myDelegate;
[wkWebView loadHTMLString:@"<HTML><BODY>TEST</BODY></HTML>" baseURL:nil];
_defaultWebView = wkWebView;
}
}
在这里帮助我。
+load
充满了危险和脆弱。由于 +load
几十年来的意外,我不得不追踪许多有趣的错误。一般来说,应该避免。并且在使用时,它应该特别接触到系统其余部分的最少部分,因为您将更改在运行时初始化事物的顺序。
我建议您在框架中设置某种初始化挂钩,您的框架的客户端预计会在应用程序中调用,通常是在应用程序委托的 didFinishLaunching:....
方法期间。
您可以将 assert()s
放入其他代码路径中,如果框架未正确初始化,这些代码路径会发出警告或引发错误。