2011-10-30 5 views
3

J'ai deux entités (Session et Utilisateur). L'entité de session a une relation loggedInUser avec l'entité User. Et l'entité Utilisateur a une relation inverse de session avec l'entité Session.Les relations inverses CoreData doivent-elles être représentées comme des propriétés conservées?

Xcode génère des propriétés avec l'attribut retain pour les relations directes et inverses. Est-ce que ça va du point de vue du graphique d'objet? Ma compréhension est que la relation inverse devrait être représentée en tant que propriété assign. En outre, dans l'éditeur de schéma, il n'est pas possible de voir quelle relation est la relation principale (c'est-à-dire que la valeur de session de session est inversée et celle de session est enregistrée).

Peut-être qu'il me manque quelque chose?

Merci.

+0

Que voulez-vous dire la relation 'main'? Une relation est importante dans les deux sens. Une 'session' a un' utilisateur' ou inversement un 'utilisateur' a une' session'. Pourquoi une direction est-elle plus importante que l'autre? –

+0

Je veux dire que dans ma conception, Session est l'objet parent et l'utilisateur est un enfant. Sinon, il y aura une boucle de retenue. –

Répondre

2

n'a pas vraiment expliquer pourquoi en tant que tel, mais la docs Apple pour Core Data état

En plus de propriétés étant toujours nonatomic, dynamiques ne honorent conserver ou à copier les attributs-assign est traité comme conserver. Vous devez utiliser la copie avec parcimonie car cela augmente les frais généraux. Vous ne pouvez pas utiliser la copie pour les relations car NSManagedObject n'adopte pas le protocole NSCopying et cela n'a aucune incidence sur le comportement des relations trop nombreuses.

Donc, en lisant que même si vous avez défini une relation comme assign il serait traité comme retain

+0

Donc, je suppose que le framework s'occupera de libérer les objets correctement (en évitant les cycles de retenue). Merci d'avoir apporté ça. –

+0

Une autre question est que Xcode 4.2 génère "conserver" au lieu de "fort" avec ARC activé. Pensez-vous que je devrais changer pour "fort"? –

+1

Les données de base n'évitent pas les cycles de retenue. Vous devez les gérer vous-même en supprimant l'arborescence avec '-refreshObject: mergeChanges:' lorsque vous parcourez un cycle. – adonoho

Questions connexes