在动态框架中使用 +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 放入其他代码路径中,如果框架未正确初始化,这些代码路径会发出警告或引发错误。