我使用一个类别将+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发布于 2019-01-14 13:31:25
类别用于将方法添加到类型,而不是重写方法。用类别重写方法是未定义的行为(在某些情况下,它是定义的行为,但可能不是您想要的行为)。+load是一个现有的方法,因此不应该在类别中定义。
这种特殊情况非常糟糕,因为这个+load可能会被多次调用(对于系统中的每个UIResponder ),所以didFinishLaunching:可能被调用多少次,而且您在任何情况下都会污染NSNotificationCenter (这对性能的影响在这个范围内是绝对重要的)。
你不应该用这种魔法。当您的代码运行时,让调用方控制。即使您想要执行这种魔术,它作为+load方法在Observer上也会更好。
https://stackoverflow.com/questions/54179811
复制相似问题