CopyWithZone: Affectation d'un objet dans un autre?
nark
Membre
Salut à tous...
Petit problème d'affectation d'une valeur dans un objet.
À savoir j'ai un objet Book et un objet Author.
Chaque objet "Book" gère un objet "Author", ainsi:
Et donc, dans mon contrôleur (qui gère un NSArray de Book), je souhaite affecter un Author à un de mes Book's. Pour cela j'utilise KVO, et cela marche très bien pour les NSString ou autre type de valeur. Je fais:
Mais à l'exécution j'obtiens l'erreur suivante:
J'ai tout de suite pensé à un problème d'alloc, mais un retain ne change rien. De plus, j'ai rien trouvé de très pertinent via Google.
PS: Cette affectation de valeur se fait dans un pool (NSThread).
PS 2: Ce code est une partie d'une très longue requête d'importation depuis un serveur SQL (via MCPKit), afin de traduire un modèle SQL en un modèle Objet pour être utiliser avec souplesse dans un application Cocoa. Bien sur, il s'agit là de gérer une relation entre deux entités, book et author, ou la table book contient la clé de son author correspondant.
Merci d'avance si vous avez une lumière.
Petit problème d'affectation d'une valeur dans un objet.
À savoir j'ai un objet Book et un objet Author.
Chaque objet "Book" gère un objet "Author", ainsi:
<br />@interface Book : NSObject {<br /> NSString *title;<br /> Author *author;<br />}<br />@property (readwrite, copy) Author *author;<br />
Et donc, dans mon contrôleur (qui gère un NSArray de Book), je souhaite affecter un Author à un de mes Book's. Pour cela j'utilise KVO, et cela marche très bien pour les NSString ou autre type de valeur. Je fais:
<br />Author *theAuthor = [[Author alloc] init];<br />[aBook setValue:theAuthor forKey:@"author"];<br />
Mais à l'exécution j'obtiens l'erreur suivante:
*** -[Author copyWithZone:]: unrecognized selector sent to instance 0x16cab1a0<br />*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Author copyWithZone:]:
J'ai tout de suite pensé à un problème d'alloc, mais un retain ne change rien. De plus, j'ai rien trouvé de très pertinent via Google.
PS: Cette affectation de valeur se fait dans un pool (NSThread).
PS 2: Ce code est une partie d'une très longue requête d'importation depuis un serveur SQL (via MCPKit), afin de traduire un modèle SQL en un modèle Objet pour être utiliser avec souplesse dans un application Cocoa. Bien sur, il s'agit là de gérer une relation entre deux entités, book et author, ou la table book contient la clé de son author correspondant.
Merci d'avance si vous avez une lumière.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Cela signifie qu'à chaque affectation d'un auteur à un livre, l'objet Author est copié. Ce n'est peut-être pas le comportement souhaité. Je pense que dans ce genre d'application, il suffit d'une référence vers l'auteur dans chaque livre.
Comment est programmé le setter de author dans Book ?
author n'est pas déclaré comme une property ?
C'est bon, j'ai implémenté le protocole NSCopying, et ça roule impeccable.
J'ai pas de méthode set, j'utilise KVO.
Si si, j'ai corrigé mon post précédent en ajoutant la property, en (readwrite, copy), je pensais que cela suffisait pour gérer l'affectation. En fait non, il faut tout de même implémenter NSCopying sur l'objet source.
Sinon, comment faire pour bosser avec seulement des références? Cela m'arrangerait parce qu'il s'agit bien d'un modèle relationnel.
Merci pour la précision.
Et là c'est KVC que tu utilises avec setValue:forKey: pas KVO :
Et de la même manière que jpimbert, je te conseille fortement d'utiliser
Dans un soucis de logique, de cohérence et de facilité, notamment pour être capable de réunir tous les Book ayant le même author, ou des trucs de ce genre.
De plus, si le nom de l'auteur change, il est logique que celui-ci change pour tous les livres, ce qui n'est pas le cas si tu fais des copies.
Merci pour vos solutions, mon problème est résolu en implémentant NSCopying.
Par contre j'ai une autre question, donc je vais ouvrir un autre topic... :^)
Je peux te dire que dans ton cas, tu ne devrais pas utiliser cet attribut, au lieu de "copy" tu devrais utiliser "retain"...