Pregunta

he tenido un par de preguntas relacionadas con este: en Objective-C

  

array NSArray; en un ámbito local sería un objeto "asignado" en la pila. array NSArray *; indica un objeto apoyado por un trozo de memoria, típicamente asigna desde el montón.

¿Cómo se sabe cuando algo se le asigna en la pila y en el montón? Son todas las variables locales en la pila y son todos los punteros en el montón?

  

Debido a que no está dereferencing el puntero al objeto y que puntero al objeto es crítica dentro de la propia implementación del método. Cuando se dice ...

Huh

¿Fue útil?

Solución

  

¿Cómo se sabe cuando algo se le asigna en la pila y en el montón? Son todas las variables locales en la pila ...

No importa. La pila y el montón son detalles de implementación; los lenguajes C y Objective-C no saber acerca de ellos, y por lo general no deben tener ninguna razón para preocuparse si algo está en la pila o el montón.

En Mac OS X, las variables locales en la pila. Sin embargo, para casi todos los propósitos, esto es de ninguna consecuencia. No se preocupe por ello.

  

... y son todos los punteros en el montón?

No. Los punteros son direcciones de memoria; eso es todo.

Pointer las variables pueden estar en cualquier lugar cualquier otra variable pueden, es decir, en cualquier lugar (sujeto a limitaciones de aplicación definidos por el que usted no necesita preocuparse, como se señaló anteriormente).

mi puntero tutorial para más información.

  
    

Debido a que no está dereferencing el puntero al objeto y que puntero al objeto es crítica dentro de la propia implementación del método. Cuando se dice ...

  
     

Huh

Un puntero es una dirección de memoria. Como tal, se hace referencia a la memoria en esa dirección. Dereferencing el puntero está accediendo a esa memoria.

Se accede nunca, nunca directamente a la memoria un objeto de cacao ocupa. Sólo envíe mensajes, ya sea a hacerle preguntas o indicarle que haga cosas. Por lo tanto, nunca eliminar la referencia al puntero.

“... ese puntero al objeto es fundamental dentro de la propia implementación del método.” Significa que el objeto, en sus implementaciones de métodos, tendrá su propio puntero. Sólo es posible enviar un mensaje a un puntero a un objeto (este detalle es generalmente elided). Si de alguna forma logrado esto, el receptor del mensaje (es decir, el objeto que contactado a) sería no tiene su propio puntero.

Supongamos que fuera posible enviar un mensaje a un objeto sin referencia. La norma sigue siendo para enviar mensajes a los punteros a objetos, por lo que, con toda probabilidad, el objeto todavía tendrá que puntero a sí mismo de decisiones que la capacidad hipotética de mensaje de un objeto sin referencia inútil.

Ya que es inútil, lo dejaron por completo. El objeto tendrá su propio puntero (el puntero es fundamental para implementaciones de método del objeto), para que pueda solamente enviar un mensaje a su puntero.

Otros consejos

El * es el operador eliminar la referencia para C, C ++ y Objective-C. Comprender el operador eliminar la referencia, y la gestión de memoria en general es mucho más amplio que Objective-C. Esta es una habilidad fundamental para cualquier desarrollador de C / C ++ / Objective-C. Echar un vistazo a la multitud de introducción C tutoriales en la red para obtener más información.

Editar: tutorial sobre cualquier punteros c va a hacer. Como este http://home.netcom.com/~tjensen/ptr/pointers .htm

En cacao, que nunca uso los objetos asignados pila; TODOS los objetos serán precedidos por un * (recuerde que el tipo "id" es realmente un sinónimo de "puntero a un objeto") y creó en el montón.

Siempre tendrá la siguiente:

NSArray     *myArray;

y nunca esto:

NSArray     myArray;

Puede pasar por alto el segundo trozo, ya que siempre está dereferencing el puntero.

Esperamos que estos ejemplos juguete ingenuos pueden ayudarle.

En C, en una función,

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);

En C ++, en una función de función o miembro (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;

Así que en C ++, los objetos pueden existir en pila o montón

En Java, en una función o 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, 

En Objective-C, en una función o 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top