Pergunta

Normalmente, quando temos a ligação de um elemento de interface para um campo de uma classe, podemos usar a palavra-chave 'IBOutlet' para informar o pré-copiler:

@interface MyController : NSObject {
    IBOutlet NSWindow *theWindow;
}

e na implementação usamos diretamente o ponteiro theWindow para chamar métodos da classe NSWindow!

Mas quais são as vantagens de contar para o pré-compilador para criar alguns acessores para o objeto que é apontado pelo "theWindow" e gerir o objeto por meio do acessores?

Exemplo:

@interface MyController : NSObject {
   NSWindow *theWindow;
}
@property(retain) IBOutlet NSWindow *theWindow;


@implementation MyController

@synthesize theWindow;

@end

O uso da segunda solução (para todos os ponteiros de interface de elementos) diminui o desempenho do aplicativo?

Quando é uma boa prática usar a segunda forma, em vez de o primeiro?

Obrigado!

Foi útil?

Solução

Bem, em geral, não mantenho as propriedades, e a única maneira de expor os pontos de venda é se algo precisar acessar um elemento de fora, e isso geralmente é um mau sinal para o seu design de qualquer maneira.

Eu não tentei, mas eu ficaria tentado a síntese apenas a parte de leitura, e eu provavelmente o usaria apenas em lugares onde o acesso atômico era importante. Algumas partes do Appkit nem sempre são threadsafe.

Outras dicas

Bryan está correto, pois você só precisa expor as propriedades do elemento da interface do usuário se o acesso a eles for necessário de outra instância ou de outra classe. Isto é Geralmente, um sinal de um problema de design arquitetônico, mas nem sempre.

Para responder às duas últimas perguntas:

O uso da segunda solução (para todos os ponteiros para interface os elementos) diminui o desempenho do aplicativo?

Não. Não mais do que adicionar um método chamado -DossomethingReallylylyplicado diminui o aplicativo se esse método nunca for chamado. Ele pode retardar o lançamento com um monte de código não utilizado (aumentando o binário sem motivo) e certamente diminui o tempo de compilação, mas não afetará o desempenho do tempo de execução do aplicativo.

Quando é uma boa prática usar a segunda maneira em vez da primeira?

Como Bryan disse, você expõe um elemento de interface do usuário como uma propriedade (via @synthesize ou um acessador com código manual) quando precisa acessá-lo de fora de uma determinada instância dessa classe. Novamente, a necessidade de fazer isso geralmente é um sinal de um problema de design.

O tempo de um acessador leva é completamente imperceptível.Mesmo se você executou este código milhões de vezes, todos os IB máquinas preferiria anão-lo.

Se estas variáveis são definidas apenas na época e nunca acessados de fora da classe, acessores pode ser desnecessário.

Quando uma ponta está sendo desarquivada, se existir um acessador para definir uma determinada saída, o UNARCIVER o usará. Se não houver acessador, o IVAR será definido diretamente usando as funções de tempo de execução do OBJ-C para encontrá-lo pelo nome.

O acessador será mais rápido, pois você evitará todo o sloging durante o tempo de execução para encontrar o IVAR em questão. Dito isto, a menos que você esteja carregando essa ponta repetidamente, a diferença será insignificante.

A principal razão pela qual você deseja um acessador para uma saída é a mesma de qualquer outra propriedade ou propriedade que deseja publicar. É uma maneira útil de garantir que o gerenciamento de memória seja coberto corretamente.

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