Uso de asterisco em Objective-C:Perguntas relacionadas
-
20-09-2019 - |
Pergunta
Eu tive algumas perguntas relacionadas a isso: Uso de asterisco em Objective-C
Matriz NSArray;em escopo local seria um objeto "alocado" na pilha.NSArray *matriz;indica um objeto apoiado por um pedaço de memória, normalmente alocado no heap.
Como saber quando algo está alocado na pilha e no heap?Todas as variáveis locais estão na pilha e todos os ponteiros estão na pilha?
Porque você não está desreferenciando o ponteiro para o objeto e esse ponteiro para o objeto é crítico na própria implementação do método.Quando voce diz...
Huh
Solução
Como saber quando algo está alocado na pilha e no heap?Todas as variáveis locais estão na pilha…
Não importa.A pilha e o heap são detalhes de implementação;as linguagens C e Objective-C não as conhecem e geralmente você não deve ter nenhum motivo para se preocupar se algo está na pilha ou na pilha.
No Mac OS X, as variáveis locais estão na pilha.Mas, para quase todos os efeitos, isto não tem consequências.Não se preocupe com isso.
… e todos os ponteiros estão na pilha?
Não.Ponteiros são endereços de memória;isso é tudo.
Ponteiro variáveis pode estar em qualquer lugar que qualquer outra variável possa, ou seja, em qualquer lugar (sujeito a limitações definidas pela implementação com as quais você não precisa se preocupar, conforme observado acima).
Ver meu tutorial de ponteiro Para maiores informações.
Porque você não está desreferenciando o ponteiro para o objeto e esse ponteiro para o objeto é crítico na própria implementação do método.Quando voce diz...
Huh
Um ponteiro é um endereço de memória.Como tal, refere-se à memória nesse endereço.Desreferenciar o ponteiro é acessar essa memória.
Você nunca acessa diretamente a memória que um objeto Cocoa ocupa.Você apenas envia mensagens para fazer perguntas ou dizer-lhe para fazer coisas.Assim, você nunca desreferencia o ponteiro.
"... Esse ponteiro para o objeto é crítico na própria implementação do método." significa que o objeto, em suas implementações de método, precisará de seu próprio ponteiro.Só é possível enviar uma mensagem para um ponteiro para um objeto (este detalhe geralmente é omitido).Se você de alguma forma conseguisse isso, o receptor da mensagem (ou seja, o objeto que você enviou) não teria seu próprio ponteiro.
Suponha que fosse possível enviar uma mensagem para um objeto desreferenciado.A norma ainda é enviar mensagens para ponteiros para objetos, portanto, com toda a probabilidade, o objeto ainda precisará desse ponteiro para si mesmo - tornando inútil essa capacidade hipotética de enviar mensagens a um objeto desreferenciado.
Como é inútil, eles o deixaram totalmente de fora.O objeto precisará de seu próprio ponteiro (o ponteiro é fundamental para as implementações de métodos do objeto), então você pode apenas envie uma mensagem para seu ponteiro.
Outras dicas
O * é o operador de desreferência para C, C++ e Objective-C.Compreender o operador de desreferência e o gerenciamento de memória em geral é muito mais amplo do que o Objective-C.Esta é uma habilidade fundamental para qualquer desenvolvedor C/C++/Objective-C.Dê uma olhada na infinidade de tutoriais de introdução C na rede para saber mais.
Editar:qualquer tutorial sobre ponteiros c servirá.Tal como este http://home.netcom.com/~tjensen/ptr/pointers.htm
No Cocoa, você nunca usará objetos alocados na pilha;TODOS os objetos serão precedidos por um * (lembre-se que o tipo "id" é na verdade outra palavra para "ponteiro para ALGUM objeto") e criados no heap.
Você sempre terá isso:
NSArray *myArray;
e nunca isso:
NSArray myArray;
Você pode ignorar o segundo pedaço, pois está sempre desreferenciando o ponteiro.
Espero que esses exemplos ingênuos de brinquedos possam ajudá-lo.
Em C, em uma função,
int x; // x is a variable of type int in stack
int *xp; // xp is a variable of type int * (pointer to int) in stack
int *xp2 = (int *) malloc(sizeof(int)); // xp2 is a variable in stack, it points to a memory location(size is of int) in heap
xp = &x; // xp can point to x
xp = xp2; // xp can also point to what xp2 points to
free(xp2); // now xp and xp2 point to a freed memory, BAD to use xp and xp2 now.
int **y; // y is a variable in stack, type is int **
y = (int **) malloc(sizeof(int *)); // allocate a piece of memory in heap, to hold a pointer to int(int *)
*y = (int *) malloc(sizeof(int)); // allocate a piece of memory in heap, to hold an int
**y = 100; // now we can use it
free(*y);
free(y);
Em C++, em uma função ou função membro(método),
SomeClass a1; // a1 is an object of type SomeClass in stack
SomeClass *a2 = new SomeClass(); // a2 is a pointer(in stack) pointing to an object(of type SomeClass) located in heap
delete a2;
Portanto, em C++, os objetos podem existir em pilha ou heap
Em Java, em uma função ou método,
SomeClass b1; // b1 is just a reference, no object exists yet
b1 = new SomeClass(); // in java, objects can only exist in heap
int x; // however, primitive types are in stack,
No Objective-C, em uma função ou método,
SomeClass c1; // you can't do this.
SomeClass *c2 = [[SomeClass alloca] init]; // c1 is a pointer in stack, pointing to an object in heap
[c2 release];