Qual è la differenza tra una categoria e un'estensione di classe. Credo che entrambi siano usati per aggiungere metodi personalizzati nelle classi esistenti. Qualcuno può far luce su questo? Un esempio di codice sarà molto apprezzato.
Qual è la differenza tra una categoria e un'estensione di classe. Credo che entrambi siano usati per aggiungere metodi personalizzati nelle classi esistenti. Qualcuno può far luce su questo? Un esempio di codice sarà molto apprezzato.
Risposte:
Una categoria è un modo per aggiungere metodi alle classi esistenti. Di solito risiedono in file chiamati "Class + CategoryName.h", come "NSView + CustomAdditions.h" (e .m, ovviamente).
Un'estensione di classe è una categoria, ad eccezione di 2 differenze principali:
La categoria non ha nome. È dichiarato così:
@interface SomeClass ()
- (void) anAdditionalMethod;
@fineL'implementazione dell'estensione deve essere nel blocco principale @implementation del file.
È abbastanza comune vedere un'estensione di classe nella parte superiore di un file .m che dichiara più metodi sulla classe, che vengono poi implementati di seguito nella sezione principale @implementation della classe. Questo è un modo per dichiarare metodi "pseudo-privati" (pseudo-privati in quanto non sono realmente privati, semplicemente non esposti esternamente).
=> In Objective C, quando vuoi aggiungere qualche funzionalità in più a una classe senza ereditarietà, usa semplicemente la categoria per essa.
=> Si tratta con il proprio .h e .m di file
=> Categoryutilizza per aggiungere un nuovo metodo non proprietà.
-> 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.
Nota: quando aggiungiamo un nuovo file e selezioniamo un'opzione dell'obiettivo c la categoria mostra la categoria e la "categoria su" non "la sottoclasse di" quindi mostra come
@interface className (categoryName)
@end
-Si ottenere due file di .he e .m con il nome del file come ( className + categoryName.h e className + categoryName.m )
e in caso di estensione otterrai
@interface className()
@end
-Riceverai un solo file con il nome className_extensionName.h
La categoria è un modo per aggiungere metodi a una classe indipendentemente dal fatto che il codice sorgente sia disponibile o meno, il che significa che puoi aggiungere una categoria a classi di base come NSStringe anche alle tue classi personalizzate.
L'estensione può essere aggiunta solo alle classi il cui codice sorgente è disponibile perché il compilatore compila il codice sorgente e l'estensione allo stesso tempo.
Possiamo aggiungere variabili di istanza e proprietà extra nell'estensione di classe ma non nella categoria.
Qualsiasi variabile e metodo all'interno dell'estensione non è nemmeno accessibile alle classi ereditate.
Sia la categoria che l'estensione sono fondamentalmente create per gestire una grande base di codice, ma la categoria è un modo per estendere l'API della classe in più file di origine mentre l'estensione è un modo per aggiungere i metodi richiesti al di fuori del file dell'interfaccia principale.
Usa categoria quando devi suddividere il tuo stesso codice di classe in diversi file sorgente in base a diverse funzionalità, e l'estensione quando devi solo aggiungere alcuni metodi richiesti alla classe esistente al di fuori del file dell'interfaccia principale. Inoltre, quando è necessario modificare una variabile di istanza dichiarata pubblicamente in una classe, ad esempio, readonly per readwrite, è possibile dichiararla nuovamente in estensione.
Estensione : per rendere privati i metodi e per aggiungere proprietà della nostra classe personalizzata, non della classe Apple.
Categoria : per aggiungere più metodi nella classe esistente e non nella proprietà, può essere utilizzata sia per la classe personalizzata che per la classe Apple NSString.
Possiamo anche avere proprietà usando set proprietà associate nella classe di categoria.
@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
Fare riferimento: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/
@interface SomeClass ()
- (void) anAdditionalMethod;
@end
Penso che non sia il modo di dichiarare Categoria. La categoria deve avere un nome
@interface SomeClass (XYZ)
- (void) anAdditionalMethod;
@end
per esempio
@interface NSMutableArray (NSMutableArrayCreation)
+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;
@end
Dichiarato per NSMutableArray da Apple
estensione ios simile a c #, classe astratta java o interfaccia
ios categoria simile a c #, estensione classe java
Categorie
Le categorie vengono utilizzate quando si creano file contenenti un gran numero di metodi, quindi forniscono la possibilità di suddividere una singola classe in diversi moduli. Inoltre, se vengono apportate modifiche alle categorie, il compilatore non perde tempo per compilare l'intero progetto Le categorie non sono in grado di aggiungere nuove variabili o proprietà e cercare la loro classe genitore. Puoi sovrascrivere un metodo in una categoria ma non è una buona idea perché il metodo non può essere ulteriormente sovrascritto. Inoltre il flusso può essere effettuato perché tutte le categorie hanno lo stesso livello gerarchico e quindi due categorie appartenenti alla stessa classe genitore possono esistere in fase di esecuzione.Anche metodi protetti possono essere creati utilizzando le categorie
Estensioni
Le estensioni consentono di sovrascrivere la proprietà o di aggiungere una nuova proprietà alla classe genitore esistente.Sintaticamente lo stesso per le categorie che non hanno nome e sono rappresentate come @interface class () Nessun file .m è presente e il metodo dichiarato nell'estensione deve essere implementato in @implementazione del file genitore
Più aiuto a questo link
Ecco la mia comprensione:
Le estensioni vengono solitamente utilizzate per aggiungere funzionalità extra alla nostra " classe personalizzata ". Possiamo aggiungere metodi o proprietà privati estendendo l'interfaccia della classe che può essere utilizzata all'interno dell'implementazione della classe.
Le estensioni devono essere scritte nello stesso file della classe. Quindi non è possibile scrivere estensioni per tipi predefiniti come String, Float, ecc.
D'altra parte, le categorie possono essere utilizzate per aggiungere metodi extra a classi preesistenti. Esempio possiamo creare i nostri metodi estendendo la classe String. Nota che non possiamo creare proprietà extra nelle categorie. Inoltre il vantaggio principale delle categorie è che possiamo scrivere le categorie in qualsiasi altro file, al di fuori del file in cui esce la tua classe.
Inoltre, durante la creazione delle categorie, dovresti dargli un nome tra parentesi. Ma per l'estensione non è richiesto alcun nome. Quindi alcune volte sono anche chiamate categorie anonime.