Domanda

Sto facendo un'applicazione di cacao e usando XCode per varie generazioni di codice.Funziona bene per generare file .h e .m per la sottoclassante UIView, ma quando la sottoclasse UIViewController ricevo una dichiarazione di @interface identica in entrambi i file, tranne che nel file .m ha ( ) alla fine:

//in MyViewController.h
@interface MyViewController : NSViewController <MyViewDelegate>

@end
.

ma anche

//in MyViewController.m
@interface MyViewController ()

@end

@implementation MyViewController

@end
.

Eppure si compensa bene.Quindi, supponendo che questo sia un comportamento normale, le due parti della domanda sono: (A) Perché questo accade, e (B) Quali sono i risultati - specialmente in termini di ordine di compilazione?

Grazie!

È stato utile?

Soluzione

.

Quando la sottoclasse UIViewController ricevo una dichiarazione @interface identica in entrambi i file, tranne che nel file .m ha ()

Come hai notato, i due blocchi di interfaccia sono non identici - il () è importante.Quello con il () è un'estensione classe , che è simile a una categoria senza un nome.Le due importanti differenze tra una categoria e un'estensione di classe sono:

    .
  1. È possibile dichiarare le variabili di istanza in un'estensione di classe, ma non è possibile in una categoria.

  2. Un'estensione della classe deve comparire nello stesso file del blocco di implementazione.

  3. Le estensioni di classe sono utili per dichiarare variabili e metodi di dichiarazione dell'istanza che non si desidera esporre nel file di intestazione, come metodi o variabili specifiche per l'implementazione e non dovrebbero essere invocati dagli utenti della classe.

Altri suggerimenti

Hai familiarità con le categorie?Quello che stai osservando è simile, ma ha importanti distinzioni dalle categorie.La distinzione qui è che è anonimo (da qui il parente vuoto) e compilato allo stesso tempo la classe originale è compilata.La parte successiva è una parte importante: significa che è possibile aggiungere proprietà di istanza (stoccaggio).Questo è più comunemente usato per dichiarare "solo solo interni" o metodi e proprietà "privati".Ma tieni presente che in fase di esecuzione non è nozione di applicazione "privata", si tratta di quale interfaccia hai pubblicato vs. non pubblicato.Questo è solo un modo per avere un'interfaccia molto chiaramente definita che è "pubblicata" solo per le persone che aumenteranno il file di implementazione della classe principale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top