【问题标题】:Using Categories with UIResponder - Bad Idea?将类别与 UIResponder 一起使用 - 坏主意?
【发布时间】:2019-01-14 10:36:09
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c cocoa-touch cocoapods


    【解决方案1】:

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

    这种特殊情况非常糟糕,因为这个+load 可能会被多次调用(对于系统中的每个UIResponder),所以didFinishLaunching: 可能会被多次调用,而你正在污染NSNotificationCenter在任何情况下(在这种规模上肯定会影响性能)。

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

    【讨论】:

      猜你喜欢
      • 2010-09-12
      • 2014-02-13
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 2017-04-27
      • 2017-02-03
      • 1970-01-01
      • 2018-03-12
      相关资源
      最近更新 更多