【问题标题】:Class method and instance method with the same name in Objective-CObjective-C中同名的类方法和实例方法
【发布时间】:2012-12-06 15:58:36
【问题描述】:

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

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

这是个坏主意吗?是否有一些我想念的隐藏的东西。我会不会让未来的开发者感到困惑?

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

【问题讨论】:

  • 超级问题。我没有千分之一,但我可以说,实例和类方法不会冲突,因为它们的需求和实现是非常不同的。

标签: objective-c coding-style nsnotifications nsnotification


【解决方案1】:

这就是代码 cmets 的用途:)

在Objective C 中,类方法和实例方法同名是没有问题的。

我会建议:

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

  • 添加适当的评论来解释正在发生的事情,以使未来可能会感到困惑的开发人员受益

【讨论】:

  • 我认为你是对的。注释足以让未来的开发人员看到实例/类方法的重点。感谢您的意见。
【解决方案2】:

语言本身和运行时不会对您正在做的事情产生歧义。所以你在这方面是安全的。

就让未来的维护者感到困惑而言,我想你不必太担心愚蠢的自动完成错误,因为它不是你打算手动调用的方法。

也就是说,我很想将课程内容移到一个人为的类别中。这不仅会在页面上进行分离,而且会明确表明该类打算作为独立于实例响应的一部分功能进行响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2010-10-07
    相关资源
    最近更新 更多