Pergunta

Eu estou fazendo uma aplicação Cocoa, e usando o Xcode para vários geração de código.Funciona bem para geração .h e .m arquivos para subclassificação a uiview, mas quando eu subclasse UIViewController eu ter uma @interface declaração idêntica em ambos os arquivos, exceto que no .m arquivo tem ( ) no final:

//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>

@end

mas também

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end

Ainda compila-lo bem.Assim, supondo que este é o comportamento normal, as duas partes da questão são:(A) Porque é que isto acontece, e (B) Quais são os resultados-especialmente em termos de compilar ordem?

Obrigado!

Foi útil?

Solução

quando eu subclasse UIViewController eu recebo um @declaração de interface idêntica em ambos os arquivos, exceto que no .m arquivo possui ( )

Como você percebeu, os dois blocos de interface são não idêntico -- o () é importante.Aquele com o () é um extensão de classe, que é semelhante a uma categoria sem um nome.As duas diferenças importantes entre uma categoria e uma extensão da classe são:

  1. Você pode declarar variáveis de instância de uma classe de extensão, mas você não pode, de uma categoria.

  2. Uma classe de extensão devem aparecer no mesmo arquivo, como a implementação do bloco.

Classe de extensões úteis para a declaração de variáveis de instância e métodos que você não deseja expor no arquivo de cabeçalho, tais como métodos ou variáveis que são específicas para a implementação e não deve ser invocado por utilizadores da classe.

Outras dicas

Você está familiarizado com as Categorias?O que você está observando é semelhante, mas tem importantes distinções de Categorias.A diferença aqui é que ele é anônimo (daí o vazio parens) e compilados, ao mesmo tempo, a classe original é compilado.Que, mais tarde, parte é uma parte importante:isso significa que você pode adicionar propriedades de instância (de armazenamento).Isso é mais comumente usado para declarar "interno" ou "privado" métodos e propriedades.Mas tenha em mente que, em tempo de execução, não há noção de 'privado' de aplicação, é tudo sobre a interface que você tem publicado vs.não publicado.Esta é apenas uma maneira de ter muito claramente definidos interface que é apenas 'publicado' para as pessoas que o autor o arquivo de implementação da classe principal.

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