Domanda

Capisco che possiamo usare riferimenti associativi per invocare il comportamento simile a Ivar in categorie.Ma qual è la ragione specifica dietro non essere in grado di dichiarare nuovi Ivars in categorie?

è perché avremmo invadito lo spazio privato della classe?O c'è qualche altra ragione?Se sì, apprezzerei un esempio che mostra la capacità di dichiarare Ivars in categorie che rompe tutto ciò che si rompe.

È stato utile?

Soluzione

Pensa agli obiettivi Ivars come una semplice vecchia struttura a c. Quando istanziare un'istanza di una classe, un blocco di memoria viene creato abbastanza grande da contenere quella struttura.

Diciamo che hai un NSString. Lotti e un sacco di codice esistente sono compilati per utilizzare NSString. Un sacco di questo codice è costruito in biblioteche e framework. Quel codice compilato è stato creato sapendo che gli Ivars di NSString prendono il numero X di byte e sono alcuni dati offset all'interno di quella memoria.

Ora nel tuo piccolo progetto, diciamo di creare una categoria su NSString e vuoi aggiungere un IVAR. In teoria, qualsiasi codice nel progetto che include il file di intestazione per la categoria saprebbe che la dimensione di questa "nuova" NSString (Plus Categoria) prende x + Y Bytes. Questo è molto simile a una sottoclasse. Questo codice appena compilato potrebbe gestire correttamente l'aggiuntivo IVAR (s).

Ma tutto il codice pre-compilato, le biblioteche e i quadri, non avrebbero alcuna conoscenza degli ulteriori IVAR. Quando vengono create le istanze NSString, la memoria è solo x byte, non x + y bytes. Il caos si presenta come il tuo codice dell'app riceve un riferimento a quel pezzo di memoria più piccolo di memoria e tenta di accedere ai byte per la categoria Ivar. Le cose andranno a boom.

Con una semplice sottoclasse vecchia, le cose funzionano perché qualsiasi codice che può usare la sottoclasse 'Ivars sa di Ivars della sottoclasse. Ma con una categoria, il codice preesistente non ha conoscenza delle aggiunte e non creerà correttamente lo spazio per loro.

Suppongo che dovrei specificare che tutto quanto sopra è in gran parte un'ipotesi educata. Potrei essere totalmente sbagliato. Sembra almeno ragionevole. :)

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