Domanda

Sto cercando di NSArray sottoclasse, ma si blocca l'applicazione quando si cerca di accedere al metodo di conteggio. So che NSArray è un classe di cluster .

  • Ma che cosa vuol dire questo?
  • C'è un lavoro in giro per essere in grado di sottoclasse un NSArray?

So che posso NSObject semplicemente sottoclasse e il mio array come una variabile di istanza, ma vorrei piuttosto NSArray sottoclasse.

Modifica Motivo: Sto creando un gioco di carte, ho una Deck classe che dovrebbe sottoclasse NSMutableArray di avere un paio di metodi extra (-shuffle, -removeObjects:, -renew, ecc), e penso che avrà un aspetto più pulito per sottoclasse NSArray piuttosto che avere una var.

È stato utile?

Soluzione

Il problema con l'aggiunta di una categoria su una classe come questo è che tutte le istanze della classe erediteranno i metodi aggiuntivi. Che è sia inutile (dal momento che non tutti i bisogni di array per poter essere mescolate, etc.) e pericolosa (perché non si può beneficiare di typechecking per essere sicuri che il NSArray si sta riferendosi a è davvero uno che ci si aspettava per essere mescolate ).

Un'alternativa potrebbe essere quella di creare una classe Deck che ha un NSMutableArray come una variabile di istanza. Ci si può definire azioni sul ponte esattamente come si vorrebbe, e il fatto che si sta utilizzando un NSMutableArray diventa un dettaglio di implementazione. Ciò consente di sfruttare typechecking al momento della compilazione e permette di modificare l'implementazione interna della classe Deck senza cambiare i propri clienti. Per esempio, se si decide per qualche motivo che un NSMutableDictionary sarebbe una migliore negozio di supporto, è possibile effettuare tutte le modifiche entro l'implementazione della classe Deck senza modificare il codice che crea e utilizza il Deck.

Altri suggerimenti

Di solito si ha bisogno di sottoclasse, ma in ogni caso i suggerimenti fatti da Apple sono:

  

Ogni sottoclasse di NSArray deve sovrascrivono metodi di istanza primitivi count e objectAtIndex:. Questi metodi devono operare sul archivio di backup che si forniscono per gli elementi della collezione. Per questa memoria di supporto è possibile utilizzare una matrice statica, un oggetto NSArray normale, o qualche altro tipo di dati o meccanismo. Si può anche scegliere di ignorare, parzialmente o completamente, qualsiasi altro metodo NSArray per i quali si desidera fornire un'implementazione alternativa.

Hai veramente Override countmethod? Come si suol dire è necessario fornire la propria struttura di supporto per gli elementi dell'array attesa e l'override metodi suggeriti in considerazione questo ..

Se sei solo l'aggiunta di nuovi metodi, e utilizzando l'archivio di backup esistente, quindi un approccio migliore è quello di aggiungere una categoria per NSArray. Le categorie sono una parte davvero potente di Objective-C - vedi cocoadev per alcuni campioni

.

NSMutableArray ha già un - (void)removeObjectsInArray:(NSArray *)otherArray; Si sta andando ad essere meglio fuori fare una sottoclasse NSObject con una proprietà di matrice mutevole.

In questo caso particolare, mi piacerebbe mischiare l'array usando -sortedArrayUsingComparator: e rendere il vostro comparatore tornare in modo casuale o NSOrderedAscending NSOrderedDescending.

per esempio:

NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
    ^(id obj1, id obj2) { 
     return random() %  2 ? NSOrderedAscending : NSOrderedDescending;
     }];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top