Je suis en train d'apprendre l'objectif-c et la programmation d'une application iPad. Une chose que je continue à faire trébucher et à relire est la gestion de la mémoire. J'arrive là-bas ... lentement. Les règles de base telles que pour chaque alloc
/retain
vous devez avoir un release
est utile. Cependant, on me élude chose relativement basique et je me demande si quelqu'un pourrait expliquer ...Comprendre la gestion de la mémoire dans ios
Prenez le code suivant ...
NSArray *myArray = [[NSArray alloc] init];
myArray = [someNSSet allObjects];
Ceci est relativement simple codage avant et nécessiterait une déclaration [myArray release]
.
Cependant, je continue à voir des exemples de (et en fait, j'ai largement utilisé les éléments suivants « raccourci » ...
NSArray *myArray = (NSArray *)[someNSSet allObjects];
Comment, pour autant que je comprends lorsque vous utilisez le vous ne avez pas besoin (NSString *)
d'utiliser une déclaration [myArray release]
, mais je ne comprends pas pourquoi.
quelqu'un pourrait-il possible d'expliquer?
Pourquoi ne pas posséder la valeur retournée? Qui/quoi? –
@BenThompson: Lorsque vous créez un objet (nouveau ou alloc, copy ou mutableCopy), il a un nombre de retenues de 1 et vous le possédez. Lorsque vous envoyez un message à un objet, son nombre de réceptions est incrémenté de 1 et vous le possédez également. Vous avez seulement besoin de libérer des objets que vous possédez. –
@Ben: Il est fort probable que le pool autorelease soit le propriétaire de l'objet retourné par 'allObjects'. L'autre possibilité est l'objet set, mais cela ne se produirait réellement que si l'ensemble exposait simplement un objet qu'il possédait déjà, plutôt que de créer un nouveau tableau. À l'exception d'une compréhension de ce qui se passe en arrière-plan, cependant, vous ne devriez pas vous préoccuper de savoir à qui appartiennent les choses. Soit vous faites ou vous ne faites pas, et c'est tout ce que vous devez considérer. –