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

Using Categories with UIResponder - Bad Idea?

我正在使用类别将 +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 方法会更好。