Метод класса и метод экземпляра с тем же именем в Objective-С

У меня есть решение проблемы с уведомлением, которое хорошо работает, но я боюсь, что это может быть плохой идеей.

У меня есть уведомление о том, что для каждого экземпляра класса и самим классом. Чтобы справиться с этим, я регистрируюсь для уведомления как классом, так и экземплярами класса. Поскольку это одно и то же уведомление, я назвал класс и метод экземпляра одинаковыми. Это соответствует стандарту мы как обработчики уведомлений упомянутый.

это плохая идея? Есть ли какой-то скрытый got'ca, которого мне не хватает. Буду ли я путать черт из будущих разработчиков?

+ (void)initialize
{
    if (self == [SICOHTTPClient class]) {
        [[self notificationCenter] addObserver:self
                                      selector:@selector(authorizationDidChangeNotification:)
                                          name:SICOJSONRequestOperationAuthorizationDidChangeNotification
                                        object:nil];
    }
}

- (id)initWithBaseURL:(NSURL *)url
{
    self = [super initWithBaseURL:url];

    if (self) {
        self.parameterEncoding = AFJSONParameterEncoding;
        [self registerHTTPOperationClass:[SICOJSONRequestOperation class]];
        [self setDefaultHeader:@"Accept" value:@"application/json"];

        if ([[self class] defaultAuthorization])
            [self setDefaultHeader:@"Authorization" value:[[self class] defaultAuthorization]];

        [[[self class] notificationCenter] addObserver:self
                                              selector:@selector(authorizationDidChangeNotification:)
                                                  name:SICOJSONRequestOperationAuthorizationDidChangeNotification
                                                object:nil];
    }

    return self;
}

- (void)dealloc
{
    [[[self class] notificationCenter] removeObserver:self
                                                 name:SICOJSONRequestOperationAuthorizationDidChangeNotification
                                               object:nil];
}

#pragma mark Notifications

- (void)authorizationDidChangeNotification:(NSNotification *)notification
{
    NSString *authorization = notification.userInfo[SICOJSONRequestOperationAuthorizationKey];

    if ([authorization isKindOfClass:[NSString class]]) {
        [self setDefaultHeader:@"Authorization" value:authorization];
    } else {
        [self clearAuthorizationHeader];
    }
}

+ (void)authorizationDidChangeNotification:(NSNotification *)notification
{
    NSString *authorization = notification.userInfo[SICOJSONRequestOperationAuthorizationKey];

    if ([authorization isKindOfClass:[NSString class]]) {
        [self setDefaultAuthorization:authorization];
    } else {
        [self setDefaultAuthorization:nil];
    }
}

2 ответов


Это то, что комментарии к коду для :)

в Objective C нет проблем с методом класса и методом экземпляра с одинаковым именем.

Я бы посоветовал либо:

  • измените спецификацию имени метода уведомления, чтобы обработать это (а затем обработать уведомление класса с другим соответствующим именем), или

  • добавить соответствующий комментарий, чтобы объяснить, что происходит в интересах будущего потенциально запутанные разработчики


сам язык и среда выполнения не увидят никакой двусмысленности в том, что вы делаете. Так что на этом фронте ты в безопасности.

Что касается путаницы будущих сопровождающих, я думаю, вам не нужно слишком беспокоиться о глупых ошибках автозаполнения, потому что это не метод, к которому вы собираетесь совершать ручные вызовы.

тем не менее, я бы соблазнился переместить материал класса в искусственную категорию. Это не только даст разделение на странице, но и сделает явным, что класс намерен ответьте как отдельный транш функциональности от ответов экземпляра.