Pergunta

Percebi isso ao usar o iOS6 beta 3

Quando eu crio uma nova subclasse de UIViewContoller (nenhuma outra classe pai gera esse comportamento que eu notei), o arquivo .m agora tem uma categoria vazia na parte superior do arquivo.No passado, ao aprender sobre categorias, percebi que algumas pessoas usavam essa mesma técnica para indicar métodos privados (embora não verdadeiramente privados).

É essa a intenção aqui?Houve alguma mudança para tornar as coisas realmente privadas agora?Percebo a diretiva @private por aí também.

Qual é o seu estilo de codificação pessoal em relação a vars e métodos privados?

ATUALIZAR:Como o XCode está nos incentivando a usar as extensões de classe, fui em frente e as usei para métodos privados/ivar para este projeto.Eu encontrei uma desvantagem.Vi que poderia reutilizar um dos meus UIViewControllers subclassificados junto com todos os seus UIButtons, UILabels, etc.Eu tive esta herança:UIViewController <- FirstViewController <- SecondViewController.

Bem, todos os métodos privados que coloquei na extensão de classe do FirstViewController não aparecem no preenchimento automático quando codifico no SecondViewController.Um leve incômodo....

Foi útil?

Solução

Você está se referindo a esta definição de interface:

@interface MYViewController ()
@end

Esta é tecnicamente uma extensão de classe e não uma categoria.As categorias possuem uma string entre parênteses.Extensões de classe são adicionadas à classe em tempo de compilação e, portanto, podem adicionar ivars (geralmente na forma de propriedades).As categorias são adicionadas em tempo de execução e não podem adicionar ivars.

Tudo isso dito, seu argumento está correto.Isso é usado para definir métodos e propriedades privadas.

No mundo ObjC, “privado” é um sinal de “proibição de invasão”, não uma parede de arame farpado.Embora haja um @private palavra-chave (que adiciona aplicação do compilador), ela se aplica apenas a ivars e geralmente não é necessária.Este tipo de privacidade baseada em avisos funciona muito bem no ObjC e é suficiente.

Coloque suas propriedades privadas nesta extensão de classe, e os chamadores externos receberão avisos "podem não responder ao seletor" se tentarem acessá-los (assim como receberiam ao chamar qualquer método indefinido).Você nunca deve permitir a existência de avisos em um projeto ObjC, portanto, isso impõe o encapsulamento de dados.


EDITAR

Se forem privados, não deverão aparecer na sua subclasse.O que você quer está protegido.Não existe um grande esquema para métodos protegidos no ObjC, mas uma técnica comum é colocá-los em uma categoria em um arquivo .h como MYViewController+Protected.h.Acho que isso raramente acontece na prática, já que grande parte do bom design do ObjC não é subclasse.Em vez disso, usa composição e delegação.

Em relação a "Por que apenas visualizar controladores". Primeiro, não é apenas visualizar controladores.É apenas visualizar controladores no iOS (bem, VC, TableViewController e GLKViewController).No Mac, também são controladores de janela e importadores de destaque.Olhar dentro:

.../Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Templates
.../Library/Xcode/Templates

Mas por que isso?Bem, todos esses são controladores, e é extremamente comum que os controladores precisem de propriedades privadas.Na verdade, se você não tiver propriedades privadas em um controlador, provavelmente estará tornando públicas demais.Isso não é tão universal nas classes de modelo e visualização.Suspeito que isso influenciou a decisão deles.Também podem ter sido pessoas diferentes que possuíam os modelos ou que eles foram atualizados em momentos diferentes.Às vezes você vê pequenas inconsistências que se suavizam com o tempo.

Você também pode criar seus próprios modelos.Ver Criando modelos de arquivo Xcode 4 personalizados.

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