PDA

Visualizza la versione completa : [Objective c] Singleton da visualizzare in tutti i metodi


sapientino
04-04-2012, 19:26
Originariamente inviato da Caiodark
Crea una classe SingletonArray con questo header:



static NSMutableArray *array;

@interface CBSingletonArray : NSObject
{

}
+ (NSMutableArray *)getArrayInstance;
@end


e questa implementazione :



@implementation CBSingletonArray
+ (NSMutableArray *)getArrayInstance{
if (array == nil){
array = [[NSMutableArray alloc] init];
}
return array;
}
@end


In ogni file implementazione dove hai bisogno del vettore aggiungi l'import all'header SingletonArray.

Per accedere al vettore:



NSMutableArray *array = [CBSingletonArray getArrayInstance];


In questo modo sei sicuro di istanziare un solo array e di poterci accedere ovunque ti serva.



Il primo metodo, quello che usava un NSMutableArray globale funziona davvero.
Però ho notato ciò che (il mio idolo) Caiodark mi aveva detto: nel caso della deallocazione dell'array il programma va in palla.

Ho cominciato ad usare il metodo del Singleton, propostomi anche quello dall'utente (che risulta essere il mio idolo) Caiodark.

Il problema è che pur adoperandomi con tutto me stesso se uso il singleton all'interno di un metodo risulta che la dichiarazione locale nasconde le variabili d'istanza.
Riporto: "local declaration of 'array' hides instance variable".


-(IBAction)addObj: (id)sender{
NSMutableArray *array = [CBSingletonArray getArrayInstance];
OggettoQualsiasi *oggetto = [[OggettoQualsiasi alloc] init];
[array insertObject:oggetto atIndex:0];
}


Ho provato anche a dichiararlo nel main, ma rimane comunque nascosto al resto.
Devo buttare il computer o è possibile risolvere questa roba?

EDIT:
Sto provando ad anteporre extern davanti al vettore richiamato all'interno del metodo, ma tutto ciò mi sta soltanto facendo innervosire :dhò:

sapientino
04-04-2012, 20:15
-

sapientino
04-04-2012, 22:54
ok, sto capendo che l'errore sta nei metodi che non sono correttamente specificati.
Però non capisco dove sia l'inghippo nello specifico.

Caiodark
05-04-2012, 14:36
Calma e sangue freddo. Hai dichiarato NSMutableArray *array nel tuo header, togli quella dichiarazione e funziona tutto.

sapientino
05-04-2012, 15:38
Originariamente inviato da Caiodark
Calma e sangue freddo. Hai dichiarato NSMutableArray *array nel tuo header, togli quella dichiarazione e funziona tutto.

Se tolgo dall'header

static NSMutableArray* array;
nel file d'implementazione dice che non ho dichiato cosa sia array già in


if (array == nil){

C'è da impazzire. :confused:

Who am I
05-04-2012, 22:02
extern e static non vanno d' accordo.
extern = prende la variabile da un altro file
static =la variabile ha linkage interno, vive cioè nell scope del file all' interno al quale è stata dichiarata.
Non la puoi nemmeno dichiarare all' interno della classe (come campo) perché la sintassi lo vieta.

Ti basterebbe cambiare il nome della variabili usate, ma se proprio non vuoi fare altrimenti, puoi dichiarare la variabile all' interno di un metodo:



- (NSMutableArray**) get
{
static NSMutableArray* array;
return &array;
}


Per averla a disposizione quando ti pare.

sapientino
06-04-2012, 02:55
Se volessi utilizzare il suddetto metodo, che riporto qui sotto


- (NSMutableArray**) get
{
static NSMutableArray* array;
return &array;
}

come devo modificare il file header e quello d'implementazione, che adesso sono questi


static NSMutableArray *array;

@interface CBSingletonArray : NSObject
{

}
+ (NSMutableArray *)getArrayInstance;
@end




@implementation CBSingletonArray
+ (NSMutableArray *)getArrayInstance{
if (array == nil){
array = [[NSMutableArray alloc] init];
}
return array;
}
@end

Who am I
06-04-2012, 13:31
Originariamente inviato da sapientino
Se volessi utilizzare il suddetto metodo, che riporto qui sotto
...
come devo modificare il file header e quello d'implementazione, che adesso sono questi


Prenditi un libro di Objective-C.

sapientino
06-04-2012, 18:35
ce l'ho ma non parla dei singleton e non ho intenzione di spendere altri 30€!!
Qualcuno mi può dare una mano?

Who am I
06-04-2012, 18:44
Ma parla sicuramente di cosa mettere in un header e nel file .m che contiene l' implementazione della classe (sono le basi).

Loading