Question

J'ai eu quelques questions liées à cela: utilisation d'Asterisk en Objective-C

  

array NSArray; dans une portée locale serait un objet « affecté » sur la pile. tableau NSArray *; indique un objet soutenu par un morceau de la mémoire, généralement attribuée à partir du tas.

Comment savez-vous quand quelque chose est alloué sur la pile et sur le tas? Sont toutes les variables locales sur la pile et sont tous les pointeurs sur le tas?

  

Parce que vous n'êtes pas déréférencement le pointeur sur l'objet et que pointeur vers l'objet est critique dans la mise en œuvre de la méthode elle-même. Quand vous dites ...

Huh

Était-ce utile?

La solution

  

Comment savez-vous quand quelque chose est alloué sur la pile et sur le tas? Sont toutes les variables locales sur la pile ...

Il n'a pas d'importance. La pile et tas sont des détails de mise en œuvre; les C et les langues Objective-C ne les connaissent pas, et vous ne devriez généralement pas de raison de prendre soin si quelque chose est sur la pile ou du tas.

Sous Mac OS X, les variables locales sont sur la pile. Mais, pour presque toutes les fins, cela est sans conséquence. Ne vous inquiétez pas.

  

... et sont tous les pointeurs sur le tas?

Non. Les pointeurs sont des adresses de mémoire; c'est tout.

pointeur de variables peut être n'importe où d'autres variables peuvent, ce qui est à dire, en tout lieu (sous réserve des limites définies de mise en œuvre qui vous avez besoin se soucient pas, comme il est indiqué ci-dessus).

Voir mon tutoriel pointeur pour plus d'informations.

  
    

Parce que vous n'êtes pas déréférencement le pointeur sur l'objet et que pointeur vers l'objet est critique dans la mise en œuvre de la méthode elle-même. Quand vous dites ...

  
     

Huh

Un pointeur est une adresse de mémoire. En tant que tel, il fait référence à la mémoire à cette adresse. Déréférencement du pointeur accède à cette mémoire.

Vous ne jamais accéder directement à la mémoire d'un objet Cocoa prend. Vous envoyez des messages, il ne soit lui poser des questions ou dire à faire des choses. Ainsi, vous ne déréférence le pointeur.

« ... que pointeur vers l'objet est critique dans la mise en œuvre de la méthode elle-même. » Signifie que l'objet, dans ses implémentations de méthode, aura besoin de son propre pointeur. Il est possible d'envoyer un message à un pointeur vers un objet (ce détail est généralement éludée). Si vous avez tiré en quelque sorte ceci, le récepteur du message (qui est l'objet que vous messaged) n'aurait pas son propre pointeur.

Supposons qu'il était possible d'envoyer un message à un objet déréférencé. La norme est toujours d'envoyer des messages à des pointeurs vers des objets, donc, selon toute vraisemblance, l'objet aura encore besoin que pointeur sur lui-même faire cette capacité hypothétique au message un objet déréférencé inutile.

Comme il ne sert à rien, ils l'ont laissé complètement. L'objet aura besoin de son propre pointeur (le pointeur est essentiel pour les implémentations de la méthode de l'objet), de sorte que vous pouvez uniquement envoyer un message à son pointeur.

Autres conseils

* est l'opérateur de déréférencement pour C, C ++ et Objective-C. Comprendre l'opérateur de déréférencement et la gestion de la mémoire en général est beaucoup plus large que Objective-C. C'est une compétence fondamentale pour tout C / C ++ / développeur Objective-C. Jetez un oeil à la multitude de tutoriels d'introduction C sur le net pour en savoir plus.

Edit: tout tutoriel sur les pointeurs de c fera. Tels que cette http://home.netcom.com/~tjensen/ptr/pointers .htm

En Cocoa, vous ne serez jamais utiliser la pile d'objets attribués; Tous les objets seront précédés d'un * (rappelez-vous que le type « id » est vraiment un autre mot pour « pointeur vers un objet ») et créé sur le tas.

Vous aurez toujours ceci:

NSArray     *myArray;

et jamais ceci:

NSArray     myArray;

Vous pouvez ignorer le deuxième morceau, puisque vous déréférencement toujours le pointeur.

En espérant que ces exemples de jouets naïfs peuvent vous aider.

C, dans une fonction,

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

C ++, dans une fonction de la fonction ou élément (méthode),

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;

Donc, en C ++, les objets peuvent exister dans la pile ou tas

En Java, en une fonction ou méthode,

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, 

Objective-C, en une fonction ou méthode,

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];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top