Quelle est la différence entre une catégorie et une extension de classe. Je crois que les deux sont utilisés pour ajouter des méthodes personnalisées dans les classes existantes. Quelqu'un peut-il faire la lumière là-dessus? L'examen avec le code sera vraiment apprécié.
objective-c
Abhinav
la source
la source
Réponses:
Une catégorie est un moyen d'ajouter des méthodes à des classes existantes. Ils résident généralement dans des fichiers appelés "Class + CategoryName.h", comme "NSView + CustomAdditions.h" (et .m, bien sûr).
Une extension de classe est une catégorie, à l'exception de 2 différences principales:
La catégorie n'a pas de nom. Il est déclaré comme ceci:
@interface SomeClass ()
@finL'implémentation de l'extension doit être dans le bloc @implementation principal du fichier.
Il est assez courant de voir une extension de classe en haut d'un fichier .m déclarant plus de méthodes sur la classe, qui sont ensuite implémentées ci-dessous dans la section principale @implementation de la classe. C'est une façon de déclarer des méthodes "pseudo-privées" (pseudo-privées en ce qu'elles ne sont pas vraiment privées, mais pas exposées de l'extérieur).
la source
=> En Objective C, lorsque vous souhaitez ajouter plus de fonctionnalités à une classe sans héritage, vous utilisez simplement la catégorie pour cela.
=> il est livré avec ses propres fichiers .h et .m
=>
Category
utilise pour ajouter une nouvelle méthode et non des propriétés.-> In Objective C, when you want to make behaviour of some property private you use class extension. -> it comes with **.h** file only. -> mainly for properties.
@interface className (categoryName) @end
-Vous obtiendrez deux fichiers .h et .m avec le nom de fichier comme ( className + categoryName.h et className + categoryName.m )
et en cas d'extension, vous obtiendrez
@interface className() @end
-Vous n'obtiendrez qu'un seul fichier avec le nom className_extensionName.h
la source
La catégorie est un moyen d'ajouter des méthodes à une classe, que le code source soit disponible ou non, ce qui signifie que vous pouvez ajouter une catégorie à des classes de base comme
NSString
et à vos propres classes personnalisées.L'extension ne peut être ajoutée qu'aux classes dont le code source est disponible car le compilateur compile le code source et l'extension en même temps.
Nous pouvons ajouter des variables d'instance et des propriétés supplémentaires dans l'extension de classe mais pas dans la catégorie.
Les variables et méthodes à l'intérieur de l'extension ne sont même pas accessibles aux classes héritées.
La catégorie et l'extension sont toutes deux conçues pour gérer une base de code volumineuse, mais la catégorie est un moyen d'étendre l'API de classe dans plusieurs fichiers source, tandis que l'extension est un moyen d'ajouter les méthodes requises en dehors du fichier d'interface principal.
Utilisez la catégorie lorsque vous devez diviser votre même code de classe en différents fichiers source en fonction de différentes fonctionnalités, et l'extension lorsque vous avez juste besoin d'ajouter certaines méthodes requises à la classe existante en dehors du fichier d'interface principal. De plus, lorsque vous devez modifier une variable d'instance déclarée publiquement dans une classe, par exemple, en lecture seule pour readwrite, vous pouvez la re-déclarer dans l'extension.
la source
Extension : Pour rendre les méthodes privées et pour ajouter des propriétés de notre propre classe personnalisée, pas de la classe Apple.
Catégorie : pour ajouter plus de méthodes dans la classe existante et non dans la propriété, elle peut être utilisée à la fois pour la classe personnalisée et la classe Apple comme
NSString
.la source
Nous pouvons également avoir des propriétés en utilisant la propriété associée set dans la classe de catégorie.
@interface SomeClass (Private) @property (nonatomic, assign) id newProperty; @end NSString * const kNewPropertyKey = @"kNewPropertyKey"; @implementation SomeClass (Private) @dynamic newProperty; - (void)setNewProperty:(id)aObject { objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN); } - (id)newProperty { return objc_getAssociatedObject(self, kNewPropertyKey); } @end
Reportez-vous: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/
la source
@interface SomeClass () - (void) anAdditionalMethod; @end
Je pense que ce n'est pas la manière de déclarer la catégorie. La catégorie doit avoir un nom
@interface SomeClass (XYZ) - (void) anAdditionalMethod; @end
par exemple
@interface NSMutableArray (NSMutableArrayCreation) + (id)arrayWithCapacity:(NSUInteger)numItems; - (id)initWithCapacity:(NSUInteger)numItems; @end
Déclaré pour NSMutableArray par Apple
la source
extension ios similaire à c #, classe abstraite java ou interface
catégorie ios similaire à c #, extension de classe java
la source
Catégories
Les catégories sont utilisées lorsque vous créez un fichier contenant un grand nombre de méthodes, elles vous permettent donc de diviser une seule classe en différents modules.De plus, si des modifications sont apportées aux catégories, le compilateur ne perd pas de temps à compiler l'ensemble du projet .Les catégories ne peuvent pas ajouter de nouvelles variables ou propriétés et regarder jusqu'à leur classe parente. Vous pouvez remplacer une méthode dans une catégorie, mais ce n'est pas une bonne idée car la méthode ne peut pas être remplacée. De plus, le flux peut être effectué car toutes les catégories ont le même niveau hiérarchique et par conséquent deux catégories appartenant à la même classe parente peuvent exister au moment de l'exécution.
Extensions
Les extensions vous permettent de remplacer la propriété ou d'ajouter une nouvelle propriété à la classe parente existante.Syntatiquement identiques aux catégories, elles n'ont pas de nom et sont représentées comme @interface class () Aucun fichier .m n'est présent et la méthode déclarée en extension doit être implémentée dans @implémentation du fichier parent
Plus d'aide sur ce lien
la source
Voici ma compréhension:
Les extensions sont généralement utilisées pour ajouter des fonctionnalités supplémentaires à notre propre « classe personnalisée ». Nous pouvons ajouter des méthodes privées ou des propriétés étendant l'interface de classe qui peuvent être utilisées dans l'implémentation de la classe.
Les extensions doivent être écrites dans le même fichier que la classe. Par conséquent, vous ne pouvez pas écrire d'extensions pour des types prédéfinis tels que String, Float, etc.
D'autre part, les catégories peuvent être utilisées pour ajouter des méthodes supplémentaires à des classes préexistantes. Exemple, nous pouvons créer nos propres méthodes en étendant la classe String. Notez que nous ne pouvons pas créer de propriétés supplémentaires dans les catégories. Le principal avantage des catégories est également que nous pouvons écrire les catégories dans n'importe quel autre fichier, en dehors du fichier où votre classe se termine.
De plus, lors de la création de catégories, vous êtes censé lui donner un nom entre crochets. Mais pour l'extension, aucun nom n'est requis. Par conséquent, parfois, elles sont également appelées catégories anonymes.
la source