Diferença de desempenho entre notação de ponto versus chamada de método em Objective-C

StackOverflow https://stackoverflow.com/questions/34674

  •  09-06-2019
  •  | 
  •  

Pergunta

Você pode usar uma notação de ponto padrão ou uma chamada de método em Objective-C para acessar uma propriedade de um objeto em Objective-C.

myObject.property = YES;

ou

[myObject setProperty:YES];

Existe diferença de desempenho (em termos de acesso ao imóvel)?É apenas uma questão de preferência em termos de estilo de codificação?

Foi útil?

Solução

Notação de ponto para acesso à propriedade em Objective-C é uma mensagem enviada, assim como a notação de colchetes.Isto é, dado isto:

@interface Foo : NSObject
@property BOOL bar;
@end

Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];

As duas últimas linhas serão compiladas exatamente da mesma forma.A única coisa que muda isso é se uma propriedade tiver um getter e/ou setter atributo especificado;no entanto, tudo o que faz é alterar a mensagem enviada, e não se a mensagem é enviada:

@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end

if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }

Ambas as duas últimas linhas serão compiladas de forma idêntica.

Outras dicas

Confira artigo de Cocoa é minha namorada.A essência disso é que não há penalidade de desempenho ao usar um em vez do outro.

No entanto, a notação torna mais difícil ver o que está acontecendo com suas variáveis ​​e quais são elas.

A única vez que você verá uma diferença de desempenho é se não marcar uma propriedade como "não atômica".Então @synthesize adicionará automaticamente o código de sincronização em torno da configuração de sua propriedade, mantendo-a segura para threads - mas mais lenta para configurar e acessar.

Portanto, você provavelmente deseja definir uma propriedade como:

@property (não atômico, reter) NSString *myProp;

Pessoalmente, acho a notação de ponto geralmente útil do ponto de vista de você não ter que pensar em escrever métodos setter corretos, o que não é completamente trivial, mesmo para setters não atômicos, porque você também deve se lembrar de liberar o valor antigo corretamente.Usar código de modelo ajuda, mas você sempre pode cometer erros e geralmente é um código repetitivo que confunde as classes.

Um padrão a ser observado:se você mesmo definir o setter (em vez de deixar @synthesize criá-lo) e começar a ter outros efeitos colaterais ao definir um valor, você provavelmente deverá tornar o setter um método normal em vez de chamar usando a notação de propriedade.

O uso semanticamente de propriedades parece ser um acesso direto ao valor real para o chamador e qualquer coisa que varie disso deve ser feito através do envio de uma mensagem, não do acesso a uma propriedade (mesmo que ambos estejam realmente enviando mensagens).

Pelo que vi, não há uma diferença significativa de desempenho entre os dois.Estou razoavelmente certo de que na maioria dos casos ele será 'compilado' no mesmo código.

Se você não tiver certeza, tente escrever um aplicativo de teste que execute cada método um milhão de vezes ou mais, enquanto cronometra quanto tempo leva.Essa é a única maneira de ter certeza (embora possa variar em diferentes arquiteturas).

Leia também esta postagem do blog sobre Cocoa with Love:

http://cocoawithlove.com/2008/06/speed-test-nsgestionobject-objc-20.html

Lá, o autor compara a velocidade do acessador personalizado e das notações de ponto para NSManagedObject e não encontra diferença.No entanto, o acesso KVC (setValue:forKey:) parece ser duas vezes mais lento.

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