Les documents comprennent une explication assez longue sur les raisons pour lesquelles Apple ne veut pas que vous fassiez cela et pourquoi ils ne le supportent pas explicitement dans les documents d'information. Réception d'objets mutables . Le résumé est :
Alors ne prenez pas de décision sur l'objet mutabilité des objets basée sur ce que l'introspection vous dit à propos d'un objet. Traitez objets comme mutables ou non en fonction de ce que l'on vous donne aux limites de l'API (c'est-à-dire en fonction du type de retour). Si vous avez besoin de marquer sans ambiguïté un objet comme mutable ou immuable lorsque vous le transmettez aux clients, passez cette information comme un avec l'objet.
Je trouve que leur exemple NSView est le plus facile à comprendre, et il illustre un problème de base de Cocoa. Vous avez un NSMutableArray appelé "elements" que vous voulez exposer comme un tableau, mais vous ne voulez pas que les appelants s'en mêlent. Vous avez plusieurs possibilités :
- Exposez votre NSMutableArray comme un NSArray.
- Toujours faire une copie non-mutable lorsque cela est demandé
- Stocke les éléments sous forme de NSArray et crée un nouveau tableau à chaque mutation.
J'ai fait tout ça à différents moments. #Le numéro 1 est de loin la solution la plus simple et la plus rapide. Elle est également dangereuse, puisque le tableau peut muter dans le dos de l'appelant. Mais Apple indique que c'est ce qu'ils font dans certains cas (notez l'avertissement pour -sous-regards dans NSView). Je peux confirmer que si les points 2 et 3 sont beaucoup plus sûrs, ils peuvent créer des problèmes de performance majeurs, ce qui est probablement la raison pour laquelle Apple a choisi de ne pas les utiliser sur les membres très accédés comme les -subviews.
Le résultat de tout ceci est que si vous utilisez le numéro 1, alors l'introspection vous induira en erreur. Vous avez un NSMutableArray coulé en NSArray, et l'introspection indiquera qu'il est mutable (l'introspection n'a aucun moyen de savoir le contraire). Mais vous ne devez pas le muter. Seul le contrôle de type à la compilation peut vous le dire, et c'est donc la seule chose à laquelle vous pouvez faire confiance.
La solution à ce problème serait une sorte de version immuable et rapide de la structure de données mutable. De cette façon, le numéro 2 pourrait être réalisé avec des performances décentes. Je peux imaginer des changements au cluster NSArray qui permettraient cela, mais cela n'existe pas dans Cocoa aujourd'hui (et pourrait avoir un impact sur les performances de NSArray dans le cas normal, ce qui en ferait un échec). Même si nous l'avions, il y a probablement trop de code qui repose sur le comportement actuel pour que l'introspection de la mutabilité soit un jour fiable.