Question

Je comprends que nous pouvons utiliser associatif références à invoquer ivar-comme le comportement de catégories.Mais quelle est la raison derrière de ne pas être en mesure de déclarer de nouvelles ivars dans les catégories?

Est-ce parce que nous allions envahir l'espace privé de la classe?Ou est-il une autre raison?Si oui, j'aimerais avoir un exemple qui montre la capacité de déclarer ivars dans les catégories de briser tout ce qu'elle casse.

Était-ce utile?

La solution

Pensez à l'Objective-C est ivars comme un bon vieux C-structure.Lorsque vous instanciez une instance d'une classe, d'un bloc de mémoire est créé assez grand pour contenir cette structure.

Disons que vous avez un NSString.Beaucoup, beaucoup de code existant est compilé à utiliser NSString.Beaucoup de ce code est intégré dans des bibliothèques et des structures.Qui a compilé le code a été créé en sachant que le ivars de NSString prendre X nombre d'octets et sont à certains décalages dans ce mémoire.

Maintenant, dans votre propre petit projet permet de dire que vous créez une catégorie à NSString et vous souhaitez ajouter un ivar.En théorie, tout le code dans votre projet qui inclut le fichier d'en-tête pour la catégorie savez que la taille de ce "nouveau" NSString (plus catégorie) prend X + Y octets.C'est un peu comme une sous-classe.Ce nouveau code compilé peut traiter correctement avec les autres ivar(s).

Mais tous de le pré-code compilé, les bibliothèques et les cadres, elle n'aurait aucune connaissance de la supplémentaires ivars.Lorsque NSString des instances sont créées là, la mémoire est X octets, et non pas X + Y octets.Le Chaos s'ensuit que votre code d'application, obtient une référence à cette petite partie de la mémoire et tente d'accéder à un les octets pour la catégorie ivar.Les choses iraient de boom.

Avec un simple vieux sous-classe, les choses parce que tout code que vous pouvez utiliser la sous-classe' ivars sait à propos de la sous-classe de ivars.Mais avec une catégorie, pré-code existant n'a pas connaissance de l'ajout et de ne pas créer correctement l'espace pour eux.

Je suppose que je dois spécifier que tous les ci-dessus est en grande partie une supposition éclairée.Je pourrais être complètement faux.Il semble raisonnable, au moins.:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top