Sublinhado prefixo no nome da propriedade?

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

Alguém pode me apontar para uma explicação do uso de sublinhados, eu sempre assumi que eles são usados ​​para destacar que você está acessando o iVar [_window release]; ao invés de acessar o iVar através de um método setter / getter [[self window] release]; ou [self.window release]; Eu só quero verificar se meu entendimento está correto.

 @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) IBOutlet UILabel *markerLabel; @synthesize window = _window; @synthesize markerLabel = _markerLabel; 

O uso de um sublinhado para os nomes ivar é uma convenção usada pela Apple pela primeira vez para diferenciar entre um ivar real e uma propriedade. Muitas pessoas já adotaram essa convenção.

A razão pela qual isso é feito é evitar o erro de atribuir um novo valor a um ivar em vez do setter real:

 myIvar = newValue; 

ao invés de

 self.myIvar = myValue; 

Se você acidentalmente usar o exemplo de cima, você pode causar um memory leaks. O sublinhado evita que você cometa esse erro.

É uma convenção e sua compreensão parece boa.

Outro mérito desta convenção é que você não pode acidentalmente acessar o ivar sem usar o setter, porque

 view = viewController.view ; // usually bad 

não irá compilar se o ivar for _view vez de view .

Eu normalmente não declaro o ivar, e apenas uso @property e @property . Sem um ivar explícito declarado, o compilador (pelo menos um recente) gera automaticamente o ivar (com o mesmo nome). Então o código acima compila sem problema, e não serve como um protetor contra não usar o setter, mas você pode acabar com uma linha de código …. o que pode ser uma coisa ruim para apontar e eu não recomendo para você: p