gpt4 book ai didi

ios - 将类别与 UIResponder 一起使用 - 坏主意?

转载 作者:行者123 更新时间:2023-11-28 20:54:23 25 4
gpt4 key购买 nike

我正在使用一个类别将 +load 添加到 UIResponder,这样我放在一起的 Cocoapod 就可以得到一个 didFinishLaunching使用 Cocoapod 的人无需修改他们的 appDelegate 即可收到通知。

这是个坏主意吗?这样做会产生一些我没有想到的后果吗?

类别:

@implementation UIResponder (MyCategory)

+ (void) load
{
[[NSNotificationCenter defaultCenter] addObserver: [Observer sharedInstance]
selector: @selector(didFinishLaunching:) name: UIApplicationDidFinishLaunchingNotification object: nil];
}
@end

通知观察者:

#import <Foundation/Foundation.h>

@implementation Observer

+ (id)sharedInstance {
static Observer *bridgeInstance = nil;
@synchronized(self) {
if (bridgeInstance == nil)
bridgeInstance = [[self alloc] init];
}
return bridgeInstance;
}

- (void) didFinishLaunching: (NSNotification*) n
{
UIWindow *appWindow = [[[UIApplication sharedApplication] delegate] window];
NSLog( @"application: %@", [UIApplication sharedApplication] );
NSLog( @"delegate: %@", [[UIApplication sharedApplication] delegate] );
}
@end

最佳答案

类别用于向类型添加方法,而不是覆盖方法。用类别覆盖方法是未定义的行为(在某些情况下它是已定义的行为,但可能不是您想要的行为)。 +load 是一种现有方法,因此永远不应在类别中定义。

这种特殊情况真的很糟糕,因为这个 +load 可能会被调用很多次(对于系统中的每个 UIResponder),所以 didFinishLaunching: 可能会被调用任意次数,并且在任何情况下你都会污染 NSNotificationCenter(这对性能有影响,在这种规模下肯定很重要)。

你不应该做这种魔术。让调用者控制您的代码何时运行。即使你想做这种魔术,作为 Observer 上的 +load 方法也会更好。

关于ios - 将类别与 UIResponder 一起使用 - 坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54179811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com