Comprendre le comptage de références avec Cocoa et Objective-C

Je commence tout juste à jeter un œil à Objective-C et Cocoa en vue de jouer avec le SDK de l'iPhone. Je suis raisonnablement à l'aise avec les concepts malloc et free de C, mais le schéma de comptage des références de Cocoa me rend plutôt confus. On me dit que c'est très élégant une fois que vous l'avez compris, mais je n'ai pas encore dépassé le stade.

Comment fonctionnent release, retain et autorelease et quelles sont les conventions concernant leur utilisation ?

(Ou à défaut, qu'avez-vous lu qui vous a aidé à l'obtenir ?)

请先 登录 后评论

2 réponses

Matt Sheppard

Josué (

请先 登录 后评论
Chris Hanson

Si vous écrivez du code pour le bureau et que vous pouvez cibler Mac OS X 10.5, vous devriez au moins envisager d'utiliser le ramasse-miettes Objective-C. Cela simplifiera vraiment la majeure partie de votre développement - c'est pourquoi Apple a mis tout en œuvre pour le créer en premier lieu et pour qu'il fonctionne bien.

En ce qui concerne les règles de gestion de la mémoire lorsque vous n'utilisez pas GC :

  • Si vous créez un nouvel objet en utilisant +alloc/+allocWithZone:, +new, -copy ou -mutableCopy ou si vous 5 un objet, vous en prenez possession et devez vous assurer qu'il est envoyé -release.
  • Si vous recevez un objet d'une autre manière, vous n'en êtes pas le propriétaire et ne devez pas vous assurer qu'il est envoyé -release.
  • Si vous voulez vous assurer qu'un objet est envoyé -release, vous pouvez soit l'envoyer vous-même, soit envoyer l'objet -autorelease et le pool autorelease actuel lui enverra -release (une fois par -autorelease reçu) lorsque la piscine sera vidée.

Généralement, -autorelease est utilisé pour s'assurer que les objets vivent pendant la durée de l'événement en cours, mais sont ensuite nettoyés, car il existe un pool de libération automatique qui entoure le traitement des événements de Cocoa. Dans Cocoa, il est beaucoup plus courant de renvoyer des objets à un appelant qui sont automatiquement libérés que de renvoyer des objets que l'appelant lui-même doit libérer.

请先 登录 后评论
  • 3 abonnés
  • 0 favoris,456 Feuilleter
  • Matt Sheppard posée à 2023-03-27 18:40