Objective-C中同名的类方法和实例方法

Objective-C中同名的类方法和实例方法,objective-c,coding-style,nsnotifications,nsnotification,Objective C,Coding Style,Nsnotifications,Nsnotification,我有一个通知问题的解决方案,效果很好,但我担心这可能是个坏主意 我有一个通知,需要由类的每个实例和类本身来处理。为了处理这个问题,我注册了一个由类和类实例发出的通知。因为它是完全相同的通知,所以我将类和实例方法命名为相同的。这遵循我们为通知处理程序的命名方式设置的标准 这是个坏主意吗?是不是有什么我不知道的秘密。我会把未来的开发者搞糊涂吗 + (void)initialize { if (self == [SICOHTTPClient class]) { [[self n

我有一个通知问题的解决方案,效果很好,但我担心这可能是个坏主意

我有一个通知,需要由类的每个实例和类本身来处理。为了处理这个问题,我注册了一个由类和类实例发出的通知。因为它是完全相同的通知,所以我将类和实例方法命名为相同的。这遵循我们为通知处理程序的命名方式设置的标准

这是个坏主意吗?是不是有什么我不知道的秘密。我会把未来的开发者搞糊涂吗

+ (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];
    }
}

这就是代码注释的用途:)

对于具有相同名称的类方法和实例方法,在目标C中没有问题

我建议:

  • 修改通知方法名称规范以处理此问题(然后使用另一个适当命名的方法处理类通知),或者

  • 添加适当的注释,解释正在发生的事情,以利于未来可能困惑的开发人员


语言本身和运行时不会在您所做的事情中发现任何歧义。所以你在这方面是安全的

至于让未来的维护人员感到困惑,我想你不必太在意愚蠢的自动完成错误,因为你不打算手动调用它


也就是说,我很想把课堂上的东西放到一个人工的类别里。这不仅在页面上提供了分离,而且明确了类打算作为独立于实例响应的功能部分进行响应。

超级问题。我没有太多的观点,但我可以说,实例和类方法不会冲突,因为它们的需求和实现非常不同。我认为你是对的。注释对于未来的开发人员来说已经足够好了,可以看到实例/类方法的要点。谢谢你的意见。