Pergunta

Há algumas coisas sobre o Objective-C que são confusas para mim:

Em primeiro lugar, no Guia Objective-C, é muito claro que cada classe precisa chamar o método init de sua subclasse. Está um pouco claro sobre se uma classe que herda diretamente do NSObject precisa chamar seu init método. É este o caso? E se sim, por que isso?

Em segundo lugar, na seção sobre NSObject, há este aviso:

Uma classe que não precisa herdar qualquer comportamento especial de outra classe deve, no entanto, ser uma subclasse da classe NSObject. As instâncias da classe devem pelo menos ter a capacidade de se comportar como objetos Objective-C em tempo de execução. A herdeira dessa habilidade da classe NSObject é muito mais simples e muito mais confiável do que reinventá -la em uma nova definição de classe.

Isso significa que eu preciso especificar que todos os objetos herdem do NSObject explicitamente? Ou isso é como Java/Python/C#, onde todas as classes são subtipos de NSObject? Caso contrário, há algum motivo para fazer uma classe de raiz diferente do NSObject?

Foi útil?

Solução

1) Sempre que um objeto é alocado no Objective-C, sua memória é zerada e deve ser inicializada por uma chamada para init. Subclasses de NSObject pode ter seu próprio especializado init rotinas, e no início de tal, deveriam chamar sua superclasse ' init rotina algo assim:

self = [super init];

A ideia é que tudo init rotinas eventualmente chegam a NSObject's init.

2) Você precisa ser explícito sobre a herança:

@instance myClass : NSObject { /*...*/ } @end

Não há razão para ter uma classe de raiz além de NSObject -Muito objetivo-C depende muito dessa classe; portanto, tentar contornar isso resultará em você se atirar desnecessariamente no pé.

Outras dicas

Como é possível herdar de diferentes classes de base radicular, sim, você deve declarar explicitamente que você herda do NSObject quando você faz qualquer nova classe (a menos que, é claro, esteja subclassificando outra coisa, que por sua vez provavelmente subclasse nsObject).

Quase nunca é necessário fazer sua própria classe base, nem seria fácil fazê -lo.

O Objective-C pode ter várias classes raiz, portanto, você precisa ser explícito sobre a herança. Iirc Nsproxy é outra classe raiz. Você provavelmente nunca desejará ou precisará criar sua própria classe raiz, mas eles existem.

Quanto a chamar o init de NSObject, é parte personalizada e de segurança. O Init do NSOBJECT pode não fazer nada agora, isso não garante que o comportamento futuro não mude. Ligue para o init para estar seguro.

Você precisa ligar para [Super Init], porque há código por trás da inicialização de que você não precisa escrever porque está escrito para você no NSOBJETS INIT, como provavelmente alocação de memória real etc.

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