Pergunta

O meu entendimento é que os protocolos são como interfaces em outras línguas - que declarar métodos esperados - (. Talvez até mesmo tipos que você não fazer próprio), enquanto categorias permitem que você adicione novos métodos para tipos existentes

Por que, então, é que o iPhone SDK, por vezes, utilizar categorias para declarar tipos de delegado? Normalmente eu iria esperar que todos os delegados para ser digitado id , mas existem muitos exemplos em que este não é o caso.

Por exemplo, veja NSURLConnection. Seu delegado é digitado "id" eo 'contrato' é declarada como uma categoria em NSObject (NSURLConnectionDelegate).

Então: qual é a motivação para o uso de categorias nestes casos

Foi útil?

Solução

Objective-C 2.0 introduziu a directiva protocolo @optional, permitindo-lhe para declarar certos métodos de protocolo a ser opcional. Antes de Obj-C 2.0, foram utilizadas categorias para permitir métodos de delegado opcionais (especificamente, categorias em NSObject, que são chamados de protocolos informais ).

Meu palpite é que a maioria do uso da categoria-em vez de protocolo no iPhone SDK é um resquício das classes Mac equivalentes. Por exemplo, NSURLConnection existe tanto na Mac e iPhone SDKs, de modo que o código é provável compartilhada. Desde que a Apple ainda não passou por mudar todas as classes de Mac para usar protocolos formais, ficamos com um pouco de uma inconsistência.

Outras dicas

Até a revisão do Objective-C, que foi lançado com o OS X 10.5 eo iPhone SDK, chamado de "Objective-C 2.0", só se podia fazer protocolos facultativos, usando categorias. Em Objective-C 2.0, uma nova palavra-chave @optional foi adicionado em protocolos para métodos marca que foram opcional (o restante é implicitamente necessário).

Então eu acho que o que você vê é uma ligeira espera-over dos dias anteriores antes da palavra-chave @optional.

Edit: Para responder a follow-up que apareceu na pergunta original: A motivação para a utilização de uma categoria em NSObject / id para um protocolo informal é em parte para documentar e grupo que métodos o objeto pode chamar em sua fonte de dados (ou delegado ou qualquer outro), e em menor grau em avisos do compilador evitar que você está chamando métodos que o compilador não sabe que vai estar presente no objeto que recebe a chamada. Imagine ser o único a implementar a classe que chama esses métodos de fonte de dados - você provavelmente iria querer verificar que o método está presente usando [obj respondsToSelector: @selector (meu: fonte de dados: método :)] sempre que você está interessado em chamar o meu : fonte de dados: método:. método no objeto obj

Isso é um legado veio de Objective-C 1.0, que não tem "método de protocolo opcional".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top