Использование категорий с UIResponder - плохая идея? - PullRequest
0 голосов
/ 14 января 2019

Я использую категорию для добавления +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

1 Ответ

0 голосов
/ 14 января 2019

Категории предназначены для добавления методов к типам, а не для переопределения методов. Переопределение метода с категорией - неопределенное поведение (в некоторых случаях это определенное поведение, но может не соответствовать желаемому). +load является существующим методом, поэтому никогда не должен определяться в категории.

Эта конкретная ситуация действительно плоха, потому что этот +load может вызываться много раз (для каждого UIResponder в системе), поэтому didFinishLaunching: может вызываться любое количество раз, и вы загрязняете NSNotificationCenter в любом случае (что влияет на производительность, что может иметь значение в этом масштабе).

Ты не должен заниматься этим видом магии. Пусть вызывающий контролирует, когда ваш код выполняется. Даже если вы захотите сделать подобную магию, лучше использовать +load метод для Observer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...