Pergunta

Então, eu vi isso:

error:(NSError **)error

na maçã doc. Por duas estrelas? Qual é o significado?

Foi útil?

Solução

A "estrela dupla" é um ponteiro para um ponteiro. Então NSError ** é um ponteiro para um ponteiro para um objeto do tipo NSError. Ele basicamente permite que você retorne um objeto de erro da função. Você pode criar um ponteiro para um objeto NSError em sua função (chamemos-lhe *myError), e em seguida, fazer algo como isto:

*error = myError;

para "retorno" que o erro para o chamador.


Em resposta a um comentário postado abaixo:

Você não pode simplesmente usar um NSError * porque em C, os parâmetros de função são passados ?? por valor , ou seja, os valores são Copiado quando passado para uma função. Para ilustrar, considere esse trecho de código C:

void f(int x)
{
    x = 4;
}

void g(void)
{
    int y = 10;
    f(y);
    printf("%d\n", y);    // Will output "10"
}

A reatribuição de x em f() não afeta fora o valor do argumento de f() (em g(), por exemplo).

Do mesmo modo, quando um ponteiro é passado para uma função, o seu valor é copiado, e re-atribuição não vai afectar o valor do lado de fora da função.

void f(int *x)
{
    x = 10;
}

void g(void)
{
    int y = 10;
    int *z = &y;
    printf("%p\n", z);    // Will print the value of z, which is the address of y
    f(z);
    printf("%p\n", z);    // The value of z has not changed!
}

É claro, sabemos que podemos mudar o valor do que pontos z para com bastante facilidade:

void f(int *x)
{
    *x = 20;
}

void g(void)
{
    int y = 10;
    int *z = &y;
    printf("%d\n", y);    // Will print "10"
    f(z);
    printf("%d\n", y);    // Will print "20"
}

Assim, é lógico que, para alterar o valor do que um NSError * aponta, também temos que passar um ponteiro para o ponteiro.

Outras dicas

Em C tudo é passar por valor. Se você quiser alterar o valor de algo que você passar o endereço dela (que passa o valor do endereço de memória). Se você quiser alterar o local onde o ponteiro aponta você passar as as addres do ponteiro.

Dê uma olhada aqui para uma explicação simples .

Em C, uma estrela dupla é um ponteiro para um ponteiro. Há um par de razões para fazer isso. Primeiro é que o ponteiro poderia ser a de uma matriz de ponteiros. Outra razão seria a de passar um ponteiro para uma função, onde a função modifica o ponteiro (semelhante a um "fora" parâmetro em outros idiomas).

A notação estrela dupla (**) não é específico para inicializar uma variável em uma classe. É simplesmente uma referência indireta dupla a um objeto.

  float myFloat; // an object
    float *myFloatPtr; // a pointer to an object
    float **myFloatPtrPtr; // a pointer to a pointer to an object

    myFloat = 123.456; // initialize an object
    myFloatPtr = &myFloat; // initialize a pointer to an object
    myFloatPtrPtr = myFloatPtr; // initialize a pointer to a pointer to an object

    myFloat; // refer to an object
    *myFloatPtr; // refer to an object through a pointer
    **myFloatPtrPtr; // refer to an object through a pointer to a pointer
    *myFloatPtrPtr; // refer to the value of the pointer to the object

notação de ponteiro duplo é usado onde o chamador tem a intenção de que um de seus próprios ponteiros precisam ser modificados por uma chamada de função, então o endereço do ponteiro, em vez do endereço do objeto, é passado para a função.

Um exemplo pode ser o uso de uma lista ligada. O chamador mantém um ponteiro para o primeiro nó. As funções Invoca chamador pesquisar, adicionar e remover. Se essas operações envolvem adicionando ou excluindo o primeiro nó, em seguida, ponteiro do autor da chamada tem de mudar, não o ponteiro .next em qualquer um dos nós, e você precisa o endereço do ponteiro para fazer isso.

Se for qualquer coisa como C, em seguida, ** significa um ponteiro para um ponteiro.

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