2009-06-09 3 views
1

Description succincte de ma configuration:Comment dois-je implémenter Hash pour un NSMutableSet stockant des objets SQL?

Il y a une classe de base SQLObject qui a un entier rowId. elle met en œuvre isEqual en comparant sa classe et son rowId:

return [self isKindOfClass:[otherObject class]] && self.rowId == otherObject.rowId; 

Elle implémente hachage par XOR sa classe avec son rowId:

return [[self class] hash]^self.rowId; 

Tous les objets sont stockés dans un NSMutableSet de sorte que si elles sont demandées la DB à nouveau, le même objet est utilisé plutôt que d'en créer un nouveau. Lors de la libération d'un SQLObject, il vérifie si le retainCount est exactement 1, et si c'est le cas, le supprime de l'ensemble, le libérant ainsi.

Le problème est qu'il ne trouve pas l'objet lorsqu'il tente de le retirer de l'ensemble. Le rowId ne change jamais, pas plus que la classe, évidemment, donc ni le hash ni l'isEqual ne changent tout au long de la vie de l'objet. Que se passe-t-il? Quelqu'un a-t-il des idées sur la raison pour laquelle ce n'est peut-être pas le cas?

Si je change la collection en NSMutableArray, elle la trouve.

+0

J'aimerais voir votre code pour ajouter et tester l'appartenance à NSMutableSet. –

Répondre

0

Je n'ai jamais trouvé une bonne solution à cela. Au lieu de cela, j'ai trouvé une approche différente:

Chaque sous-classe SQL Object a son propre NSDictionary. La clé est un NSNumber de rowId de l'objet, et la valeur est un lien faible à l'objet SQL. Lorsque l'objet SQL est désalloué, son lien faible est supprimé du dictionnaire.

Questions connexes