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

标签 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

最佳答案

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

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

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

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

相关文章:

ios - UIView 的框架原点与其中心之间的关系是什么?

ios - 内存泄漏cocos2D-spriteWithSpriteFrameName

ios - iOS 上的 assertUnfrozen

ios - 使用 ImageMagick 的 C API(在 iPhone 上?)转换为单色?

iphone - iPhone中有系统级后台队列进程吗?

ios - swift 3 : Using Two Arrays to populate grouped Table

从 APN 迁移到 firebase 后未重新生成 iOS 设备 token

iphone - 我们可以使用 AVCaptureSession 启用相机控件吗?

ios - 使用 SwiftUI 中断后恢复 AVPlayer

ios - 无法为具有 subview Controller 的两个容器 UIView 的位置更改设置动画