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