将类别与 UIResponder 一起使用 - 坏主意?
Using Categories with UIResponder - Bad Idea?
我正在使用类别将 +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
方法会更好。
我正在使用类别将 +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
方法会更好。