将类别与UIResponder结合使用-不好吗?

时间:2019-01-14 10:36:10

标签: ios objective-c cocoa-touch cocoapods

我正在使用类别将+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

1 个答案:

答案 0 :(得分:2)

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

这种特殊情况确实很糟糕,因为该+load可能被调用多次(对于系统中的每个UIResponder),因此didFinishLaunching:可以被调用任意次,而您在任何情况下都会污染NSNotificationCenter(在这种情况下,性能影响可能绝对重要)。

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