Differenza tra estensione di categoria e classe?


85

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.



3
Akusete, impossibile trovare la pagina.
Adil Hussain

chiaramente illustrato qui, code.tutsplus.com/tutorials/…
grassyburrito

Risposte:


103

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:

  1. La categoria non ha nome. È dichiarato così:

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    @fine
  2. L'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).


13
In Class-Extensiosn è possibile sovrascrivere le proprietà da una proprietà di sola lettura (pubblica) per essere lette internamente. E poiché LLVM 1.5 puoi fare ancora di più: ora puoi dichiarare le variabili di istanza in un'estensione di classe in modo che siano rimosse dall'interfaccia normale.
Max Seelemann

Perché aggiungere un'estensione di classe quando potresti semplicemente implementare questi metodi e proprietà nella classe? Mi sembra un po 'ridondante.
user1721803

1
@ user1721803 Come suggerito da Dave, potresti voler mantenere alcune proprietà / metodi non esposti. Questo è quando vengono utilizzate le estensioni. Considera una vista, potresti collegare tutti i tuoi IBOutlet e IBActions in estensione ed esporre metodi che consentono di inizializzare / aggiornare Outlet e azioni potrebbero essere delegati indietro.
GoodSp33d

@MaxSeelemann puoi per favore dimostrare come rendere "una proprietà (pubblica) di sola lettura da leggere internamente" con un breve script? Grazie.
allenlinli

Questa risposta indica l'estensione nel file "Class + CategoryName.swift", è corretto ??
Rishi

47
  1. Categoria

=> 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à.

  1. Estensione di classe
-> 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

  • Nella categoria non possiedi la classe ma in estensione lo sei.

5
@Prasanna: l'estensione della classe viene fornita solo con il file .m e non in .h
Saggy

1
l'estensione della classe viene fornita solo con un file .h e non con .m
Nishu_Priya,

32
  1. 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.

  2. Possiamo aggiungere variabili di istanza e proprietà extra nell'estensione di classe ma non nella categoria.

  3. Qualsiasi variabile e metodo all'interno dell'estensione non è nemmeno accessibile alle classi ereditate.

  4. 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.

  5. 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.


3
Ho letto 5 domande simili con molte risposte, e questa è la migliore. Grazie!
Honey

1
Puoi anche aggiungere proprietà nella categoria. Vedi la risposta di @Pebby.
atulkhatri

7

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.


Semplice ed elegante. Continuate così
Abdul Yasin

3

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/


2
@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


Questo è il modo in cui dichiari un'estensione, non una categoria -> @interface SomeClass ()
ChavirA

0

estensione ios simile a c #, classe astratta java o interfaccia
ios categoria simile a c #, estensione classe java


4
la tua risposta proprio come "il gatto è simile alla tigre, risponde a un cieco". Lol
Muruganandham K

1
in realtà non lo è. È la spiegazione più diretta e veloce se conosci c # o java.
Add080bbA

Non molto descrittivo e ha risposto a malapena alla domanda.
KVISH

0

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


0

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.


Sei un po 'fuori strada.
Abdul Yasin

@iPhoneDeveloper Possiamo scrivere l'estensione per i tipi predefiniti. Si prega di controllare questo link - stackoverflow.com/a/33942484/2060508
yo2bh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.