2010-03-04 14 views
0

en Objective-C et de parler simplement - ai-je raison dans l'hypothèse d'Quels objets I alloc/release

  1. que toutes les variables de pointeur doivent être libérés quand ils ne sont plus utilisées?
  2. Chaque variable de pointeur (*) est une classe quelconque ou non?
  3. Chaque variable de pointeur doit donc être allouée et initialisée en utilisant "alloc" et "init" (ou similaire)?
  4. Lors de la déclaration de variables à l'aide de méthodes Object, je n'ai pas besoin de "alloc" ou "init"?
  5. Les déclarations de nombres (BOOL, int, float, etc.) ne nécessitent pas de gestion de la mémoire tant qu'elles ne sont pas déclarées comme pointeur?

Merci pour tout conseil aidant à trier ma confusion iFloh

Répondre

0

je crois que vous avez raison:

  1. Oui.

  2. Je suppose. Je ne suis pas sûr de comprendre la question. Sorte de: comme vous l'avez dit, ce n'est pas nécessairement alloc + init, si vous utilisez certaines méthodes de classe. Ainsi, l'allocation et l'initialisation sont faites implicitement.

  3. Correct. (voir ci-dessus)

  4. Je crois que c'est plus que des nombres et que les primitives C ne nécessitent pas de gestion de la mémoire.

Je vous recommande de lire le memory management rules from Apple ainsi que la Stanford class on iPhone Programming.

+0

1 - incorrect. 2 - C'est un c-isme. 3 - correct. 4 - correct. 5 - Sort de. – bbum

+0

Merci pour le commentaire! Bon point sur # 1. Ce n'est pas que je ne sache pas que vous ne publiez pas explicitement chaque fois, c'est que j'ai pris la question comme "les objets doivent-ils être libérés (implicitement par moi ou ailleurs)?" (comme dans les objets auto-libérés). Mais c'était une façon stupide de lire la question :) –

2

que toutes les variables de pointeur doivent être libérées lorsqu'elles ne sont plus utilisées?

Seulement si les points « variables de pointeur » à une instance d'une classe Objective-C et seulement si vous causé cette instance à retenir précédemment. Read this: Memory Management Guide.

Chaque variable pointeur ( **) est une classe quelconque, ou non? *

Si la variable pointeur est déclarée comme étant un pointeur vers une instance d'une classe, puis il pointera vers une instance d'une classe. Sinon, ce ne sera pas le cas. Les pointeurs sont exactement cela; un pointeur - une référence - à un morceau de mémoire. Ce morceau de mémoire peut être une classe, une instance d'une classe, une structure C ou un tampon brut (ou autre chose).

Chaque variable pointeur doit donc être allouée et initialisée en utilisant "alloc" et "init" (ou similaire)?Uniquement si le pointeur pointe vers une instance d'une classe Objective-C.

S'il s'agit d'une structure C, vous pouvez utiliser malloc(). Même dans le cas d'une classe Objective-C, vous ne pouvez rien alloc quoi que ce soit:

NSString * foo = [NSString stringWithFormat: @ "Bonjour,% @", @ "World!"]; NSString * bar = @ "bar"; NSBundle * main = [NSBundle mainBundle];

(BTW: Aucune de ces besoin d'un -release.)

Lors de la déclaration variales en utilisant des méthodes d'objet, je ne peux pas besoin "alloc" ou "init"?

Cette question indique que vous devriez aller lire - et relire (je l'ai lu environ une fois tous les 18 mois pour la première décennie, j'ai écrit le code Objective-C, apprendre quelque chose à chaque fois) - the Objective-C language guide.

Vous devriez probablement aussi lire quelque chose sur le langage C lui-même. Cela vous aiderait probablement à comprendre les pointeurs par rapport aux autres types.

Les déclarations de nombres (BOOL, int, float, etc.) ne nécessitent pas de gestion de la mémoire tant qu'elles ne sont pas déclarées en tant que pointeur?

Oui, mais c'est beaucoup plus simple que d'être spécifique au type. Quand vous dites int foo; vous dites au compilateur de découper un peu d'espace dans la portée locale - sur la pile, en général - pour stocker la valeur d'un int de données. Lorsque vous dites int *foo;, vous demandez au compilateur de découper un peu d'espace dans la portée locale pour stocker un pointeur vers - pour stocker l'adresse de - un emplacement dans la mémoire qui contient un int. Ainsi, NSArray *bar est juste un pointeur sur une instance et, oui, NSArray bar;, s'il n'était pas explicitement interdit, créerait un morceau d'espace sur la pile pour contenir une instance de NSArray.

Lorsque vous avez un pointeur vers quelque chose que quelque chose doit être initialisé en quelque sorte et qui est souvent fait par l'allocation (mais pas toujours).

3

1) qui doivent être libérés toutes les variables de pointeur, quand ils ne sont pas utilisés plus ?

Cela dépend si vous "possédez" le point. Je vous recommande de lire attentivement ces règles Memory Management pour apprendre à libérer un pointeur.

2) Chaque variable pointeur (*) est une classe ou non?

Pas tous les pointeurs. Une variable pointeur peut contenir un pointeur sur un objet ou sur un bloc de mémoire. C'est juste un pointeur vers quelque chose.

3) Chaque variable pointeur doit donc à allouer à l'aide et initialisés "alloc" et "init" (ou similaire)?

Pas tous les pointeurs. Une variable pointeur peut contenir un pointeur sur un objet ou sur un bloc de mémoire. La chose pointue peut être un objet déjà existant ou un chunck alloué de mémoire.

4) Lors de la déclaration variales à l'aide d'objets méthodes que je ne peux pas besoin "alloc" ou "init"?

Pas à chaque fois. Vous pouvez obtenir un pointeur vers un objet existant sans savoir qui l'a attribué et initialisé. Encore une fois, il y a des règles de propriété à suivre. Je vous recommande de lire attentivement ces règles Memory Management.

5) déclarations numériques (BOOL, int, float, etc) ne nécessitent pas de gestion de la mémoire tant qu'ils ne sont pas déclarés comme un pointeur ?

Oui. Il existe des types primitifs appelés, et tant que vous les manipulez en tant que valeur, vous n'avez pas à gérer leur gestion de la mémoire.