2010-03-19 32 views
5

Quindi, ho letto this post, ed è praticamente esattamente quello che stavo cercando. Tuttavia ... non funziona. Immagino che non intendo andare con l'oggetto Singleton, ma piuttosto facendo l'array in un file Global.h, o inserendolo nel file _Prefix.Come creare una matrice globale?

Entrambe le volte lo faccio, però, ottengo l'errore:

Previsto specificatore-qualificatore-list prima di 'statico'

e non funziona. Quindi ... Non sono sicuro di come farlo funzionare, posso rimuovere extern e funziona, ma sento che ne ho bisogno per renderlo costante.

L'obiettivo finale è far sì che questa matrice mobile sia accessibile da qualsiasi oggetto o file nel mio progetto. L'aiuto sarebbe apprezzato!

Questo è il codice per il mio file Globals.h:

#import <Foundation/Foundation.h> 

static extern NSMutableArray * myGlobalArray; 

Non credo che ho bisogno di qualcosa nel file di implementazione. Se dovessi metterlo nel file prefisso, l'errore era lo stesso.

EDIT

Così, ho rimosso il file .m da Globals, e devo solo il codice circa in Globals.h. Supponendo che continuerò con questa pratica terribile di avere variabili globali (so che è male, voglio solo verificarlo), ora ho un nuovo errore. Dice:

"classi di storage multipli in identificatori di dichiarazione"

Se rimuovo "extern" funziona e se rimuovo "statica" funziona, ma avendo entrambi non lo fa ... e adesso?

**** doppio Modifica ****

bene, così ho provato ad aggiungere la matrice alla mia UIApplication delegato, ma sto facendo male perché non sta funzionando. Qualcuno potrebbe darmi qualche codice di esempio su dove posizionarlo e accedervi? Non so se dovrebbe andare nell'implementazione, o altrove, e una volta che l'array è inizializzato come accedervi dagli altri file ... Devo impostare una nuova variabile sull'array, o qualcosa del genere?

+0

Puoi pubblicare il tuo codice? –

risposta

3

Solo un suggerimento di programmazione generale - non condividere un array. Non hai alcun controllo su di esso e sarà praticamente impossibile risalire se qualcosa lo modifica alla volta e in un modo che non ti aspetti.

Invece, creare un oggetto con la matrice al suo interno e rendere quell'oggetto un singleton (o, meglio ancora, creare una fabbrica per esso).

Ogni volta che si desidera modificare l'array, chiamare i metodi sull'oggetto per farlo. Se lo fai, scommetto che troverai un sacco di codice ridondante che puoi inserire in questo oggetto (ad esempio, cercando nell'array un valore - fai invece un metodo di "ricerca" nell'oggetto e passa un valore).

Potrebbe sembrare un lavoro molto lungo che non dovresti fare, ma troverai che è un lavoro abbastanza divertente, e dovresti trovare che devi farlo una volta che vedi quanto il codice appartiene a questo oggetto...

2

I due (principali) modi di fare un allineamento globale sono separati - o si dispone di una classe con un metodo

static NSMutableArray *foo; 
+(NSMutableArray *)foo { 
    return foo; 
} 

(nel file .m) con il pezzo statico non nel file di intestazione , o semplicemente

static extern NSMutableArray * myGlobalArray; 

con fuori l'involucro Singleton (che credo sia meglio in quanto si evita di avere un po 'più di codice non necessario)

in entrambi i casi, è ancora una pratica t cattivo cappello proverei ad evitare.

0
#import <Foundation/Foundation.h> 

static extern NSMutableArray * myGlobalArray; 

@interface Globals : NSObject { 
} 


@end 
1

In generale, la presenza di un file "Globals.h" è un cattivo odore che c'è un antipattern al lavoro.

Vorrei anche sconsigliare il consiglio di Bill K e non usare affatto un modello Singleton.

Invece, creare l'array nel delegato dell'app e passarlo ai controller di visualizzazione radice (s) e lungo la gerarchia ai componenti che devono accedervi.

3

Basta aggiungere la matrice come una proprietà del delegato applicazione e accedervi piace:

[[UIApplication sharedApplication] myArray]; 
Problemi correlati