Stocker des CGImageRef dans un NSDictionnary
AP
Membre
Je développe une appli qui gère pas mal de CGImageRef.
Afin de réduire mes problèmes de fuites de mémoire, je voulais les mettre dans un NSDictionnary, seulement problème, cela n'hérite pas de NSObject
Quel est selon vous la bonne méthode pour réussir à les mettre dans un tel dictionnaire?
Merci d'avance pour votre aide
Afin de réduire mes problèmes de fuites de mémoire, je voulais les mettre dans un NSDictionnary, seulement problème, cela n'hérite pas de NSObject
Quel est selon vous la bonne méthode pour réussir à les mettre dans un tel dictionnaire?
Merci d'avance pour votre aide
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Par conséquent, pour mettre un CGImageRef dans un NSArray ou un NSDictionnary, il suffit de le caster en "id"
Beaucoup plus lent que la solution "toll free bridging"
Je viens d'apprendre qqlch. Merci beaucoup! Petite question additionnelle, quand la collection possède les objets qu'elle contient et que c'est un objet "CFType", lors de la suppression, elle fait un release ou un CFRelease?
Merci
De la même manière, il est possible de caster un (NSObject *) (ou tout autre objet dérivant de NSObject) en CFType et d'appeler CFRetain dessus: Ca aura le même effet qu'un envoi du message "retain".
Les 2 types sont en effet interchangeables. C'est ce qu'Apple appelle le "toll free bridging". Dans le même style, CFString et NSString sont également interchangeables. Il y a plusieurs autres classes Cocoa "bridgées" avec leur équivalent Core Foundation.
Dans le cas qui nous intéresse, la conclusion est qu'une collection Cocoa peut contenir des objets cocoa ou des objets Core Foundation. De la même manière, une collection Core Foundation peut très bien contenir des objets cocoa, et pas seulement des objets core foundation.
Et bien merci pour cette explication claire et précise
Question bête, pourquoi avoir Apple a fait 2 hiérarchies objet un peu parallèles?
Merci
Cocoa n'étant limite qu'une surcouche de CoreFoundation (bon ok c'est un peu limitatif mais bon) au même titre que Objective-C est une surcouche du C, ils n'allaient pas réinventer la roue : quand tu manipules des NSArray, en réalité sous le capot ce sont des CFArrayRefs qui sont utilisés (en fait c'est pareil, NSArray, CFArrayRefs, basiquement c'est la même chose eux aussi son "toll-free bridged"), c'est juste que l'API "Cocoa", utilisant des NSArrays, classe dérivant de NSObject, ... est plus sympa à utiliser (et est dans un contexte Cocoa qui définit la notion de classes et d'objets) que CFArrayRef qui est du C pur.
Pour être plus précis, Cocoa est séparée en deux parties:
- Foundation (tout ce qui est manipulation des données)
- App Kit (interface utilisateur et structure d'une appli).
Sur Mac, on ne se rend pas toujours bien compte dans quelle partie se trouve une classe, mais sur iPhone, les classes Foundation commencent par NS, et les classes UIKit (équivalent d'AppKit) commencent par UI.
Cette division explique certains choix de conception. Par exemple, NSString est une classe de Foundation. Mais pour pouvoir l'afficher à l'écran, une catégorie lui ajoute des méthodes (NSString Application Kit Additions), assurant ainsi la séparation.