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).
1 - incorrect. 2 - C'est un c-isme. 3 - correct. 4 - correct. 5 - Sort de. – bbum
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 :) –