1

J'ai un objetLibération lors de la notification

id currentObject; 

que je veux passer par notification. Le problème est que je ne sais pas comment le relâcher correctement et la documentation sur la gestion de la mémoire me rend fou.

que je fais comme ça en ce moment:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[currentObject copy], @"key", nil]]; 
[currentObject release]; 

Faut-il plutôt:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[currentObject autorelease], @"key", nil]]; 

?

(il est pour l'iPhone, iOS4.0)

Merci à l'avance!

Répondre

1

L'une ou l'autre façon est OK. Bien qu'il y ait une différence marginale entre ces deux approches, cela ne devrait pas faire de différence pratique dans ce cas. Tant que vous libérez votre propre propriété d'une manière ou d'une autre, tout ira bien. Le dictionnaire et le centre de notification traiteront de leurs propres problèmes de propriété dans leur propre temps.

EDIT: Oups, manqué quelque chose. Ce que j'ai dit au début s'applique toujours en général, BUT dans le premier exemple que vous appelez copy sur currentObject. Cela crée un nouveau bit de propriété - que vous immédiatement oubliez, et donc produire une fuite de mémoire.

Puisque nous ne voyons pas où vous créez currentObject, il est également possible que les deux versions soient surchargées. Mais en supposant que vous, vous libérez suffisamment cela. Mais si vous insistez pour appeler copy - probablement inutile, bien que vous en sachiez plus sur ce que currentObject est et ce qui pourrait arriver plus tard - vous devez également utiliser la nouvelle copie, par exemple en enveloppant l'appel copy dans autorelease, comme si:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MessageReceived" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[[currentObject copy] autorelease], @"key", nil]]; 
[currentObject release]; 

Si cela ne sait pas, ont une bonne lecture de la object ownership docs.

0

Vous pouvez supposer que les objets que vous passez vos objets pour résoudre leurs propres problèmes de propriété avec les objets transmis sauf si la documentation indique le contraire. Pour un exemple, faites défiler vers le bas de la vue d'ensemble du NSNotificationCenter docs et il y a un appel sur le fait qu'il ne conserve pas d'observateurs.

Votre premier exemple perd parce que vous transmettez une copie de votre objet au dictionnaire créé par -copy. Vous possédez donc à la fois l'objet et la copie, mais vous ne libérez jamais la copie (le dictionnaire conserve également la copie). Si vous voulez que le dictionnaire contient une copie de l'objet plutôt que l'objet lui-même, faites ceci:

[[NSNotificationCenter defaultCenter] 
    postNotificationName:@"MessageReceived" 
        object:nil 
       userInfo:[NSDictionary dictionaryWithObjectsAndKeys:[[currentObject copy] autorelease], @"key", nil]]; 

Le deuxième exemple est bien à condition que vous possédez currentObject-à-dire que vous avez obtenu avec de nouveaux, alloc ou une méthode contenant copier ou vous l'avez précédemment conservé.