我正在使用类别将+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
答案 0 :(得分:2)
类别用于向类型添加方法,而不是覆盖方法。用类别覆盖方法是未定义的行为(在某些情况下是已定义的行为,但可能不是您想要的行为)。 +load
是现有方法,因此切勿在类别中定义。
这种特殊情况确实很糟糕,因为该+load
可能被调用多次(对于系统中的每个UIResponder
),因此didFinishLaunching:
可以被调用任意次,而您在任何情况下都会污染NSNotificationCenter
(在这种情况下,性能影响可能绝对重要)。
您不应该做这种魔术。让调用者控制何时运行代码。即使您想做这种魔术,也最好在+load
上使用Observer
方法。