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

Foi útil?

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];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top