Pergunta

O único sublinhado em Objective-C é aparentemente reservado para uso "interno" da Apple (e estava disponível para uso com variáveis ??de instância privadas anteriores a alegação da Apple). Mas por que eles usam um duplo -underscore em sua SQLiteBooks exemplo para o iPhone? Veja esse trecho retirado MasterViewController.m:

+ (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (__editingViewController == nil) {
        __editingViewController = [[EditingViewController alloc] initWithNibName:@"EditingView" bundle:nil];
    }
    return __editingViewController;
}

Não há menção de uso duplo sublinhado neste fórum que se refere a C - é para o "uso interno do Compier." Eu acho que eu não vejo como isso é aplicável nesta situação.

Eu preciso de um ViewController em meu aplicativo que se comportam como o do SQLiteBooks exemplo projeto, mas este duplo sublinhado tem me perplexo.

Foi útil?

Solução

Nem o compilador C nem o compilador trata Objective-C nomes de variáveis ??com os principais sublinhados de forma diferente do que qualquer outro nome da variável. Um sublinhado simples ou dupla líder é simplesmente um convenção e eficaz constitui um espaço de nomes, muito parecido com o prefixo NS usado em aulas de cacau como NSString.

Olhando para o código SQLiteBooks, MasterViewController.m define essa variável global estática:

// Manage the editing view controller from this class so it can be easily accessed from both the detail and add controllers.
static EditingViewController *__editingViewController = nil;

Então, meu palpite é que o autor do SQLiteBooks usa um sublinhado duplo para indicar uma variável global.

compiladores C (e, por extensão, Objective-C) Nomes de reserva começando com dois sublinhados e uma letra maiúscula para uso pelo fornecedor do compilador, dando-lhes um espaço de nomes reservado para utilização para variáveis ??globais e as funções utilizadas para implementar bibliotecas padrão, ou para introduzir novas palavras-chave não-padrão, como __block.

Enquanto o código SQLiteBooks é tecnicamente válida, é muito facilmente confundido com o namespace reservado na minha opinião. Se você fizer reutilização esse código, eu recomendo renomeando essa variável (Xcode tem uma ótima renomear refatoração que irá fazê-lo automaticamente para você).

Outras dicas

Para o compilador, sublinhados são tratados como qualquer caractere alfabético. De modo mais geral, porém, sublinhados são normalmente utilizados por extensões de linguagem ou grandes bibliotecas para evitar conflitos com o código do usuário.

Usando sublinhados é problemático porque muitos grupos tente reservar a cada nome com uma combinação específica de sublinhados.

Apple tem tradicionalmente usado um único sublinhado prefixo para denotar uma variável de instância privada (um estilo comum em linguagens orientadas a objetos). Isto foi tomado implicar que todos devem prefixar seus ivars com sublinhados até que a Apple indicou que o uso de um sublinhado em seu código poderia criar conflitos com Cacau se a Apple decidir alterar seus cabeçalhos e talvez você não deveria. Então sublinhado prefixos tornaram-se uma prática de codificação "não recomendado".

Em linguagens C e C derivativos, qualquer palavra com sublinhados duplos que precede e se segue é uma extensão da linguagem não-padrão. extensões See da Apple como __attribute __

sublinhados extras são muitas vezes adicionados como compilador ou depurador nome desconfigurado versões de nomes originais (especialmente quando o compilador é multi-pass) e normalmente são evitados para que estes nomes permanecem claramente distintos dos originais. Google sufixo suas variáveis ??de instância locais Objective-C com sublinhados para evitar conflitos com sublinhados da Apple.

Meu conselho: não use sublinhados. Você não deve usar as variáveis ??locais com o mesmo nome como variáveis ??de instância (que é apenas confuso). O conflito só potencial é entre os parâmetros em métodos setter e as variáveis ??de instância correspondentes - e você provavelmente deve prefixar o parâmetro com um minúsculas "a", "novo" (ou similar) uma vez que este aponta claramente que o parâmetro são os valores de entrada mas ainda não é "o" valor.

É apenas uma convenção de nomenclatura de variáveis. Não do qualquer coisa. É uma maneira para o programa de escritores para lembrar-se: "Esta é uma variável privada."

Não é incomum para compilador / fornecedores de biblioteca para denotar certas PRE / sufixos como "reservados" para eles. Isto é principalmente para evitar quaisquer conflitos inadvertidas entre tipos / define / variáveis ??herdadas.

O post que você se refere é sobre define, não variáveis. Muitos compiladores usam double-sublinhados para os define que prestam e confiar.

Quanto ao porquê de ele o código de exemplo usa esse estilo -. O autor original usado o mesmo estilo de codificação ele provavelmente emprega no seu dia a dia de trabalho eo potencial conflito nunca se destacou

Você deve estar bem mantendo o exemplo de código como está, mas se isso faz você se sentir desconfortável, então você pode mudar o nome da variável.

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