J'utilise des structures C dans l'OBJC et j'ai créé une fonction qui assemble la structure comme celle de l'API de cacao. Les choses sont que cette structure n'est pas comme NSRECT O NSPOINT Cette structure Packs Objc Objects Soo Je vois une fuite de mémoire potentielle ici. Dois-je fournir une fonction de «libérer» la structure?
Je ne crée pas de classe ISKNewScategory car il n'y aura pas de comportement, mais pensez-vous que c'est une bonne approche ou que je devrais définir la classe, même la classe N'ayez aucun comportement? P>
typedef struct ISK_NewsCategory {
NSString *name;
NSString *code
} ISKNewsCategory;
NS_INLINE ISKNewsCategory ISKMakeNewsCategory(NSString *name, NSString *code) {
ISKNewsCategory category;
category.name = [name retain];
category.code = [code retain];
return category;
}
5 Réponses :
Tout ce que vous conservez, vous devez libérer. Cependant, rien ne dit que vous devez les conserver. Si la structure est "possédant" les objets, vous devez les conserver, puis vous devez les libérer. Si les objets sont retenus ailleurs, vous voudrez peut-être envisager de faibles références où vous ne conservez pas les objets. P>
Je déteste créer des cours sans comportement. : / C'est un aspect triste de l'objectif-C: Les classes sont Verbose. P>
Vous devez vous rappeler que les structures en C sont copées chaque fois qu'ils sont transmis. Par conséquent, si vos structures conservent leurs objets et que vous les donnez à quelqu'un d'autre, vous vous retrouvez automatiquement avec un nombre de référence erroné pour les objets dedans. P>
Si vous envisagez de passer autour de vos objets du tout, je pense que vous devriez en faire une classe à part entière. Si vous ne le faites pas, une simple structure ira bien. P>
À la nécessité d'un "destructeur", vous devez en avoir un. Vous devriez toujours en avoir un s'il y a un nettoyage à faire pour votre structure. P>
En réalité, la copie ne provoquera pas de supplément de conserve plus que de transmettre un objet directement, car seul le pointeur est copié.
@Cobal: C'est ce que je voulais dire. Si vous passez votre structure autour, les pointeurs des objets seront copiés et si vous vouliez les conserver pour chaque structure dans laquelle ils vivent, vous ne pouvez pas simplement faire cela.
En général, vous seriez beaucoup mieux pour créer une classe de conteneurs simple. Ainsi, toute la gestion de la mémoire est facile et que vous pouvez utiliser l'objet dans les classes de conteneurs de cacao standard sans fumer autour de l'enveloppement de la structure dans un Le seul temps qu'il pourrait être Acceptable d'utiliser une structure de cette façon est si vous avez un code extrêmement critique sur la performance où la surcharge d'objet pourrait devenir un problème. p> nsvalue code> ou autre.
Pour développer votre "unique temps": les structures itérantes sont 2-4X plus rapides que des classes itérantes. À mesure que les projets grossissent, cela devient un problème réel (le projet actuel est itérant de nombreux milliers d'articles fréquemment, doit courir en temps réel).
J'espère que cette solution sera utile pour vous.
À partir de 2018, vous pouvez maintenant utiliser les pointeurs Objc dans les structures C et ils sont conservés pendant que la structure est en mémoire. https://devstreaming-cdn.apple.com/ Vidéos / WWDC / 2018 / 409T8ZW7RUMABLSH / 409/409_WHts_New_in_llvm.pdf P>
C'est une bonne réponse moderne et définitive. Merci!