56 votes

Puis-je utiliser "classic" malloc () / free () dans les applications Objective-C / iPhone?

J'ai été jouer avec l'iPhone de développement pendant un certain temps, et bien qu'il se sent un peu maladroit quand vous êtes un "noyau dur" .NET développeur, c'est pas si mal que ça une fois que vous vous habituez à elle.

Dans chaque livre que j'ai lu sur Objective-C, il n'y a qu'en parler conserver/release (comptage de référence) pour la gestion de la mémoire. Comme un vieux skool développeur C/C++, il semble étrange que l'affectation de la voie "normale", à l'aide de malloc() et free() n'est mentionné que dans certaines notes de bas de page.

Je sais que malloc() et free() en Objective-C, mais je suis curieux de savoir si c'est courant ou pas. Après tout, si je veux allouer un tableau de 100 entiers, il me semble que c'est le moyen le plus efficace de le faire:

int *array = malloc(sizeof(int) * 100);

memset(array,0,sizeof(int) * 100);

// use the array

free(array);

Est-ce vraiment la meilleure façon, ou devrais-je éviter de plaine C gestion de la mémoire?

85voto

Nikolai Ruhe Points 45433

Il existe un wrapper Objective-C autour de la mémoire brute que j'aime beaucoup utiliser pour des tâches similaires: NSMutableData . Il a l'avantage de vous permettre de conserver / libérer la propriété, en plus de pouvoir agrandir facilement le tableau (sans avoir à effectuer le réalloc vous-même).

Votre code ressemblerait à ceci:

 NSMutableData* data = [NSMutableData dataWithLength:sizeof(int) * 100];
int* array = [data mutableBytes];
// memory is already zeroed

// use the array

// decide later that we need more space:
[data setLength:sizeof(int) * 200];
array = [data mutableBytes]; // re-fetch pointer in case memory needed to be copied

// no need to free
// (it's done when the autoreleased object is deallocated)
 

48voto

Adam Rosenfield Points 176408

Il est parfaitement bien -- Objective-C est un sur-ensemble strict de C, donc si vous voulez écrire du C, il n'y a rien de vous empêche de le faire. Dans de nombreux cas, il est avantageux d'utiliser des malloc et free pour éviter la surcharge de l'Objective-C runtime.

Par exemple, si vous avez besoin d'allouer dynamiquement un tableau d'un nombre inconnu d'entiers, il est souvent plus simple et plus facile:

int *array = malloc(N * sizeof(int));  // check for NULL return value!
// use array[0]..array[N-1]
...
free(array);

Contre:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:N];
// use NSMutableArray methods to do stuff with array; must use NSNumbers instead
// of plain ints, which adds more overhead
...
[array release];

Je travaillais sur un jeu de mots pour l'iPhone, et nous avons eu à charge un multi-mégaoctet dictionnaire de mots valides. La liste de mots a été chargé dans une géants char tableau attribué malloc(), avec quelques petits malins optimisations pour réduire la taille de la mémoire encore plus. Évidemment pour quelque chose comme cela, les frais généraux de l'utilisation d'un NSArray est complètement irréaliste sur les iPhone. Je ne sais pas exactement ce que la surcharge est, mais c'est certainement plus d'un octet par caractère.

5voto

Alex Rozanski Points 26107

Bien sûr, vous pouvez utiliser ces fonctions, parce que l'Objective-C est simplement un sur-ensemble de C. Cependant, il est assez rare de faire ce genre de chose, étant donné que l'Objectif-C contient des objets et des moyens de rendre cela plus facile.

Après tout, vous pouvez écrire le code ci-dessous:

NSMutableArray *array = [[NSMutableArray alloc] init];

//Use the array, adding objects when need be

[array release];

Bien que vous auriez à créer NSNumber objets pour stocker l' ints (depuis NSArray ne permet pas non types d'objet à ajouter), il est généralement plus commun d'utiliser des objets, car il est plus facile de déplacer des données, et le tableau des classes sont intégrés plus souvent avec d'autres classes de Cacao, et de la gestion de la mémoire est généralement plus simple que C standard de gestion de la mémoire.

Aussi, si vous commencez à ajouter ou à supprimer des objets de la table, puis le Cacao tableau d'objets de rendre les choses plus faciles à faire.

3voto

Chuck Points 138930

Si vous faites affaire avec la norme C types, il n'est pas moins courantes ou "OK" qu'en C. C'est la façon dont c'est fait en C, qui est une partie de l'Objective-C.

Il n'est également pas rare d'écrire une sorte d'objet wrapper autour de ces choses, pour la mettre en harmonie avec le reste de Cacao (KVO, gestion de la mémoire, etc.). Ainsi, vous pouvez créer une IntArray classe qui ne l' mallocing derrière les coulisses de sorte que vous pouvez conserver et de diffuser en tant que de besoin. Notez que ce n'est pas strictement nécessaire - il peut juste être pratique si ce genre de structure est une partie importante de votre programme.

2voto

Nikolai Ruhe Points 45433

C'est parfaitement bien d'utiliser malloc et libre de faire votre propre gestion de mémoire. En fait, NSObject allocWithZone: utilise malloc pour récupérer la mémoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X