7

通知の問題の解決方法はありますが、うまくいくのは間違いです。Objective-Cで同じ名前のクラスメソッドとインスタンスメソッド

クラスの各インスタンスとクラス自体で処理する必要がある通知があります。これを処理するために、クラスのクラスとインスタンスの両方による通知を登録します。それはまったく同じ通知なので、私はクラスとインスタンスメソッドを同じ名前にしました。これは、通知ハンドラの名前付け方法に設定した標準に従います。

これは悪い考えですか?隠された隠された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]; 
    } 
} 
+1

非常に疑問があります。私は数千点を持っていませんが、私は言うことができる、彼らの必要性と実装が非常に異なるので、インスタンスとクラスのメソッドは競合しません。 –

答えて

3

これは、コードのコメントは、同じ名前を持つクラスメソッドとインスタンスメソッドとObjective Cのには問題はありません:)

のためのものであるものです。

私はどちらかを示唆している:

  • は、これを処理するために、あなたの通知方法の名前仕様を修正(し、別の適切な名前のメソッドを持つクラスの通知を処理)、または

  • に適切なコメントを追加将来の利益のために潜在的に混乱して、開発者

+0

あなたは正しいと思います。コメントは、将来の開発者がインスタンス/クラスメソッドのポイントを見るのに十分なものになります。あなたのご意見ありがとうございます。 –

1

言語そのものとランタイムを何が起こっているかを説明しますSEあなたがしていることにあいまいさはありません。あなたはその前で安全です。

将来のメンテナーを混乱させる点では、マニュアルコールを行う方法ではないので、愚かな自動補完の間違いにはあまり気を付ける必要はありません。

私は、クラスのものを人工的なカテゴリに移したいと思っています。これはページを分離するだけでなく、クラスがインスタンス応答とは別の機能のトランシェとして応答することを明示します。

関連する問題