Quando você faz um sublinhado na frente de uma variável de instância?

Duplicar Possível:
Como um sublinhado na frente de uma variável em uma class de cacau objective-c funciona?

Eu vi isso na Apple, dentro do UIPickerView.h:

id _dataSource; 

Por que isso é sublinhado lá? Tem um significado especial? Uma convenção devo conhecer?

Muitas pessoas usam isso para variables ​​privadas, para diferenciar entre variables ​​privadas e variables ​​públicas dentro de um object.

É uma maneira completamente opcional de trabalhar.

O que você está vendo é o uso de sublinhados para distinguir entre variables ​​de instância e propriedades. Então, uma declaração de class pode ser:

 @interface Foo { NSString* _label; .... } @property (nonatomic, retain) NSString* label; // notice: no underline 

Em seguida, no arquivo de implementação, você teria:

 @synthesize label=_label; // the property is matched with the ivar 

Agora, quando dentro da implementação, se você quiser acessar a variável de instância diretamente, você poderia apenas usar _label mas para percorrer os methods de accessr de propriedade (que cuidam de reter / liberar e um monte de outras tarefas de manutenção) você usaria self.label . Do lado de fora, você sempre deseja passar pela propriedade {object}.label .

A outra maneira é fazer sem o sublinhado e apenas usar:

 NSString* label; @property (nonatomic, retain) NSString* label; ... @synthesize label; 

Funciona da mesma forma, mas pode confundir alguém lendo o código e tentando rastrear label vs self.label . Eu pessoalmente acho a convenção da Apple (com sublinhados) um pouco mais fácil de ler, mas é uma questão de preferência.

Como as pessoas já diziam, alguém usava Varar para dizer que uma variável era privada. Foi uma questão simples de convenção e realmente não importa.

Um outro uso, fazer uma viagem na máquina de retorno em uma function C () representava uma function que não era portátil de plataforma e __function () representava uma function que não era compiladora portátil. Portanto, na biblioteca C padrão, às vezes você verá uma variável com um _ ou __ na frente do nome, é o que essas funções representam.

Às vezes é usado para denotar variables ​​privadas. Mais geralmente significa apenas que “esta variável é diferente de alguma forma”.

pode ser que … (jogging memory) …

Lembro-me vagamente de ler um documento do ADC explicando que o Apple reserva o uso de variables ​​de membro prefixadas com sublinhado? e que desenvolvedores de terceiros são desencorajados a usar essa convenção para evitar colisões?

| K <

Eu uso sublinhados para indicar que uma variável é um membro, semelhante ao prefixo ‘m’ na notação húngara (que notação eu desprezo completamente, mas isso é outra história). Claro que você tem editores de código de cor hoje em dia, mas minha opinião é que o prefixo faz com que você pense na variável que é membro / instância antes de digitá-la, não apenas mais tarde, quando ela é codificada por colors pelo editor.

Geralmente é para denotar que uma variável não deve ser diretamente tocada por um desenvolvedor. Não é realmente uma exigência, mas é uma boa prática se você não puder evitar ter uma variável pública em uma class com a qual não quer mexer.

Eu escolho usar sublinhados para os ivars porque muitas vezes me deparo com a seguinte situação:

 @interface MyClass:NSObject { NSUInteger count; } @property(nonatomic) NSUInteger count; -(id) initWithCount(NSUInteger) count; @end (...) @implementation MyClass @synthesize count; -(id) initWithCount(NSUInteger) count { if((self = [super init])){ self.count = count; // Parameter name collides with ivar name! } return self; } @end 

Então eu faço isso:

 @interface MyClass:NSObject { NSUInteger _count; } @property(nonatomic) NSUInteger count; -(id) initWithCount(NSUInteger) count; @end (...) @implementation MyClass @synthesize count = _count; -(id) initWithCount(NSUInteger) count { if((self = [super init])){ _count = count; // No name collision } return self; } @end 

É claro que eu poderia alterar alternativamente o nome do parâmetro para “newCount” ou “aCount” (eu odeio isso). Eu acho que é uma questão de gosto.