Cosa sono e come utilizzare i Singleton
Objective-C
Quando un’applicazione diventa complessa si ha la necessità di avere dei punti di riferimento all’interno del codice che ti permettono di compiere le azioni ripetitive.
Ad esempio scaricare dei file, connettersi o disconnettersi da un servizio, processare un’immagine e tanto altro ancora.
Ci sono vari modi per risolvere questi problemi, ad esempio potremmo scrivere il codice all’interno di AppDelegate ma con il tempo questa classe diventerebbe davvero affollata e di difficile gestione.
Potremmo creare degli oggetti appositi che vengono istanziati quando serve. Però se abbiamo necessità di mantenere quei dati attivi per tutta la vita dell’app non è la scelta migliore.
Ecco quindi che vengono in aiuto i Singleton.
Altro non è che un pattern che ci permette di avere una singola istanza di una classe, viva per tutto il tempo dell’applicazione. Avremo quindi a disposizione tutti i dati all’interno di quest’oggetto in ogni momento.
Vediamo come crearlo e come utilizzarlo.
Aggiungiamo una nuova classe al progetto: Downloader, sottoclasse di NSObject.
Nel file header dichiariamo un metodo di classe (che ricordo inizia con il segno più “+” invece che con il segno meno “-“):
+ (Downloader*)sharedDownloader;
Poi nel file di implementazione aggiungere il metodo vero e proprio:
+ (instancetype)sharedDownloader { static Downloader *_sharedDownloader = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedDownloader = [Downloader new]; }); return _sharedDownloader; }
Adesso abbiamo il nostro Singleton, unica istanza all’interno della nostra app.
Per utilizzarla basterà quindi richiamare il metodo sharedDownloader e gli eventuali metodi che abbiamo creato, come ad esempio:
- (void)viewDidLoad { [super viewDidLoad]; [[Downloader sharedDownloader] doSomeStuff]; }
Questa è una classe a tutti gli effetti, quindi potete aggiungere proprietà , metodi, delegate e quanto altro vi serve per la vostra applicazione.
Proprio per la sua natura, l’oggetto creato non verrà mai deallocato dalla memoria finché l’app non sarà terminata. Ricordatevi quindi di usare sempre il metodo di classe per utilizzarla e non crearne di nuovi.
Inoltre state attenti a non mantenere dati troppo onerosi di memoria altrimenti rischiate di sovraccaricare l’app.