Eu já vi em alguns exemplos do iPhone que atributos usaram um sublinhado _ na frente da variável. Alguém sabe o que isso significa? Ou como funciona?
Um arquivo de interface que estou usando se parece com:
@interface MissionCell : UITableViewCell {
Mission *_mission;
UILabel *_missionName;
}
@property (nonatomic, retain) UILabel *missionName;
- (Mission *)mission;
Não sei exatamente o que faz o acima, mas quando tento definir o nome da missão como:
aMission.missionName = missionName;
Eu recebo o erro:
pedido de membro 'missionName' em algo que não seja uma estrutura ou união
property
arquivo .he no arquivo .m eu acessá-loself
dessa formaself.someProperty
,. Esse é o caminho certo? Ou devo usar os ivars no código?É apenas uma convenção para facilitar a leitura, não faz nada de especial para o compilador. Você verá as pessoas usá-lo em variáveis de instância privadas e nomes de métodos. Na verdade, a Apple recomenda não usar o sublinhado (se você não tomar cuidado, poderá substituir algo em sua superclasse), mas não se sinta mal por ignorar esse conselho. :)
fonte
O único propósito útil que eu vi é diferenciar entre variáveis locais e variáveis membros, conforme declarado acima, mas não é uma convenção necessária. Quando emparelhado com uma propriedade @, aumenta a verbosidade das declarações sintetizadas -
@synthesize missionName = _missionName;
e é feio em todos os lugares.Em vez de usar o sublinhado, use apenas nomes descritivos de variáveis em métodos que não entrem em conflito. Quando eles precisam entrar em conflito, o nome da variável no método deve sofrer um sublinhado, não a variável membro que pode ser usada por vários métodos . O único local comum em que isso é útil é em um setter ou em um método init. Além disso, tornará a declaração @synthesize mais concisa.
Edit: Com o recurso mais recente do compilador de auto-síntese, agora uso sublinhado para o ivar (nas raras ocasiões em que preciso usar um ivar para combinar com o que a auto-síntese faz.
fonte
Realmente não significa nada, é apenas uma convenção que algumas pessoas usam para diferenciar variáveis-membro de variáveis locais.
Quanto ao erro, parece que aMission tem o tipo errado. Qual é a sua declaração?
fonte
Isso é apenas para a convenção de nomenclatura das propriedades de sintetizar.
Quando você sintetiza variáveis no arquivo .m, o Xcode fornece automaticamente a inteligência _variável.
fonte
Ter um sublinhado não apenas torna possível resolver seus ivars sem recorrer ao uso da sintaxe self.member, mas também torna seu código mais legível, pois você sabe quando uma variável é um ivar (por causa de seu prefixo de sublinhado) ou um argumento de membro (sem sublinhado )
Exemplo:
fonte
self.image
, o que acessa a propriedade. O único momento em que você deve acessar a variável de instância_image
, diretamente é dentro dosinit
métodos e odealloc
método, ao chamar qualquer outro método, pode ser arriscado (já que o objeto é semi-inicializado ou desalocado).Este parece ser o item "principal" para perguntas sobre self.variableName vs. _variablename. O que me impressionou foi que, no .h, eu tinha:
Isso faz com que self.variableName e _variableName sejam duas variáveis distintas no .m. O que eu precisava era:
Em seguida, na classe '.m, self.variableName e _variableName são equivalentes.
O que ainda não estou claro é por que muitos exemplos ainda funcionam, mesmo que isso não seja feito.
Raio
fonte
em vez de sublinhado, você pode usar o nome self.variable ou sintetizar a variável para usar a variável ou saída sem sublinhado.
fonte
O que falta nas outras respostas é que o uso
_variable
impede que você digitevariable
e acesse distraidamente o ivar em vez da propriedade (supostamente pretendida).O compilador forçará você a usar um
self.variable
ou_variable
. O uso de sublinhados torna impossível digitarvariable
, o que reduz os erros do programador.fonte