Substituindo methods usando categorias em Objective-C

Posso usar uma categoria de turma para replace um método que já está implementado usando uma categoria? Como isso:

1) método original

-(BOOL) method { return true; } 

2) Método cancelado

 -(BOOL) method { NSLog(@"error?"); return true; } 

Isso funcionará, ou isso é ilegal?

Da documentação da Apple :

Embora a linguagem Objective-C atualmente permita que você use uma categoria para replace methods que a class herda, ou mesmo methods declarados na interface de class, você é fortemente desencorajado a fazê-lo . Uma categoria não é um substituto para uma subclass. Existem várias falhas significativas no uso de uma categoria para replace methods:

  • Quando uma categoria substitui um método herdado, o método na categoria pode, como de costume, invocar a implementação herdada por meio de uma mensagem para super . No entanto, se uma categoria replace um método existente na class da categoria, não será possível invocar a implementação original .

  • Uma categoria não pode replace de maneira confiável os methods declarados em outra categoria da mesma class.

    Esse problema é de particular importância porque muitas das classs de cacau são implementadas usando categorias. Um método definido pelo framework que você tenta replace pode ter sido implementado em uma categoria e, portanto, qual implementação tem precedência não está definida.

  • A própria presença de alguns methods de categoria pode causar mudanças de comportamento em todas as estruturas. Por exemplo, se você replace o método windowWillClose: delegate em uma categoria no NSObject, todos os representantes de janela em seu programa responderão usando o método de categoria; o comportamento de todas as suas instâncias de NSWindow pode mudar. As categorias adicionadas em uma class de estrutura podem causar alterações misteriosas no comportamento e levar a falhas.

Você pode fazer isso adaptando a abordagem de Cluster de Classe ou usando a técnica de swizzling de methods .

Caso contrário, o comportamento de dois ou mais methods categorizados é indefinido

O link da documentação antiga está morto; melhor substituto que pude encontrar estava aqui: Apple Docs :

Evite os confrontos do nome do método da categoria

Como os methods declarados em uma categoria são adicionados a uma class existente, você precisa ter muito cuidado com os nomes dos methods.

Se o nome de um método declarado em uma categoria é o mesmo que um método na class original, ou um método em outra categoria na mesma class (ou até mesmo uma superclass), o comportamento é indefinido quanto a qual método a implementação é usada em tempo de execução. É menos provável que isso seja um problema se você estiver usando categorias com suas próprias classs, mas pode causar problemas ao usar categorias para adicionar methods às classs padrão Cocoa ou Cocoa Touch.

É a Apple usando um toque mais leve, mas o ponto principal é o mesmo: você convida o desastre, porque o comportamento imprevisível é silencioso.

É importante notar que uma categoria também pode ser usada para replace os methods existentes na class base (por exemplo, o método drive da class Car), mas você nunca deve fazer isso. O problema é que as categorias são uma estrutura organizacional plana. Se você replace um método existente no Car + Maintenance.m e, em seguida, decidir que deseja alterar seu comportamento novamente com outra categoria, não é possível para o Objective-C saber qual implementação usar. Subclasss é quase sempre uma opção melhor em tal situação.

A partir deste tutorial, http://rypress.com/tutorials/objective-c/categories