Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Obj-C/Cocoa]release, autorelease,retain,retainCount

1 réponse
Avatar
Gilles
Ça a bien l'air d'être un peu le binze, surtout sur les champs ou
variable d'instance, et personne n'en parle...

A chaque fois qu'on lit un truc, c'est jamais la même manipe...

Un peu obsédé avec le retainCount, j'ai des NSLog un peu partout pour en
contrôler la valeur, ça donne beaucoup de surprises

Bref je lance le débat (on peut toujours!) comment procédez vous...

doit-on utiliser les set/getteurs dans le code, ou simplement laisser
ceux-ci a l'usage de IB/Cocoa...

En testant sur le dealloc d'un tableView je constate que les lignes de
celles-ci ne sont pas deallouées si c'est un document en création, alors
que dans le cas d'un document en modification la deallocation est
effective, dans les 2 cas l'alerte est bien appelée.

Je lis qu'un getteur doit procéder comme suit

return [[mChampInstance retain]autorelease];

Le retain semble-t-il décrémente de suite l'instance, le dealloc semble
un peu différé? est-ce la réalité?

Dans l'attente....

1 réponse

Avatar
Schmurtz
Ça a bien l'air d'être un peu le binze, surtout sur les champs ou
variable d'instance, et personne n'en parle...

A chaque fois qu'on lit un truc, c'est jamais la même manipe...


Faut aller jusqu'à la source !
Dans la document officielle de l'objective-C :

http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/inde
x.html?http://developer.apple.com/documentation/Cocoa/Conceptual/Objectiv
eC/4objc_runtime_overview/chapter_4_section_2.html

Un peu obsédé avec le retainCount, j'ai des NSLog un peu partout pour en
contrôler la valeur, ça donne beaucoup de surprises

Bref je lance le débat (on peut toujours!) comment procédez vous...


Il ne faut «releaser» que les objets que tu as «retainu» ou créé (avec
[NSBla new] ou [NSBla alloc], mais pas [NSBla blaWithTruc]).

doit-on utiliser les set/getteurs dans le code, ou simplement laisser
ceux-ci a l'usage de IB/Cocoa...


Que veux tu dires ? les set/getteurs sont incontournables, puisqu'on ne
peut pas accéder directement aux variables d'instances.

J'en profite pour dire qu'un objet recupéré par un «getteur» n'a pas à
être «releaser».

En testant sur le dealloc d'un tableView je constate que les lignes de
celles-ci ne sont pas deallouées si c'est un document en création, alors
que dans le cas d'un document en modification la deallocation est
effective, dans les 2 cas l'alerte est bien appelée.

Je lis qu'un getteur doit procéder comme suit

return [[mChampInstance retain] autorelease];


Pas forcément. Tu peux faire uniquement "return mChampInstance".

De manière générale, un objet récupéré par un getteur ne t'appartient
pas, il ne faut donc pas compter sur le fait qu'il restera longtemps
vivant. Si tu ne l'utilise pas tout de suite, il faut le retenir, puis
ensuite le relacher lorsque tu n'en a plus besoin. Dans le cas
contraire, si tu l'utilise imédiatement, il n'y a pas de problème.

Le retain semble-t-il décrémente de suite l'instance, le dealloc semble
un peu différé? est-ce la réalité?


Lorsque tu «autoreleases» un objet, il sera effectivement relâcher
lorsque le NSAutoreleasePool attaché à ton thread sera purgé. En gros,
ça se fait quelques temps après la fin de l'exécution de tes méthodes
personelles.

--
Schmurtz