Diferença entre self.var e simplesmente var

Qual é a diferença entre usar self.var vs. apenas var em uma class Objective-C? Existem benefícios ou perigos para um ou outro?

 foo = self.var; self.var = foo; 

é conceitualmente idêntico ao

 foo = [self var]; [self setVar: foo]; 

Então, usando a notação de ponto, você está enviando mensagens para si mesmo.

 foo = var; var = foo; 

é conceitualmente o mesmo que

 foo = self->var; self->var = foo; 

Portanto, não usar notação de ponto para acessar uma variável de instância é o mesmo que tratar self como um ponteiro para uma estrutura C e acessar diretamente os campos struct.

Em quase todos os casos, é preferível usar a propriedade (notação de ponto ou notação de envio de mensagem). Isso ocorre porque a propriedade pode fazer automaticamente a retenção / cópia / liberação necessária para interromper vazamentos de memory. Além disso, você pode usar o valor da chave observando com uma propriedade. Além disso, as subclasss podem replace propriedades para fornecer sua própria implementação.

As duas exceções ao uso de propriedades são ao configurar um ivar no init e ao liberá-lo no dealloc. Isso é porque você quase certamente quer evitar usar acidentalmente uma substituição de subclass nesses methods e não quer acionar nenhuma notificação de KVO.

self.var chama a propriedade de var . Nos bastidores, o Objective-C gera automaticamente um getter para propriedades (ou você mesmo pode fazer um, se quiser), então o self.var usa esse getter. var simples acessa a variável de instância diretamente (isto é, não passa pelo getter para obter o valor).

Duplicado de

  • Como a syntax de ponto funciona sem @property explícito em Objective-C?
  • auto.variável e diferença variável
  • Qual é a diferença entre usar acessadores obj-c e usar a syntax de pontos?
  • iVars, com e sem self?
  • É “eu” necessário?

e provavelmente cerca de uma dúzia de outros que você poderia ter encontrado em cerca de 15 segundos usando a checkbox “Pesquisar” no canto superior direito do site.