iOS: utilisation du délégué de l'application pour héberger les variables globales

Est-ce une mauvaise pratique d'héberger des variables que je veux être accessibles depuis toutes les classs du délégué de l'application et de les get via [[UIApplication sharedApplication] delegate] someProperty]

La vraie solution à votre question n'est pas de replace une forme d'état global par une autre (ie singletons).

Ce que vous devriez faire est de mettre l'état dans des classs "model" qui sont instanciées dans votre application, puis de les transmettre aux parties de votre application qui en ont besoin (par exemple voir les controllers), éliminant ainsi complètement votre problème d'état global.

Il n'est généralement pas recommandé de charger votre AppDelegate en tant que conteneur pour les variables à l'échelle de l'application de cette manière. Il peut rapidement devenir lourd.

Une pratique courante consiste à définir certains objects singleton, comme suit:

 + (instancetype)shared { static dispatch_once_t onceToken; static MyServiceClient* instance; dispatch_once(&onceToken, ^ //Use GCD to make a singleton with thread-safety { instance = [[self alloc] init]; }); return instance; } 

Vous pouvez ensuite fournir ces objects en tant que parameters à vos classs qui les requièrent en tant que collaborateurs.

Utiliser l'dependency injection

Notez cependant que singleton peut être considéré comme un anti-pattern . Si vous injectez ces singletons dans des classs qui les exigent, ce n'est pas trop mal, mais il est fortement déconseillé de les câbler (malheureusement, aussi une pratique courante), car cela favorise un couplage trop serré, une cohésion tests unitaires.

Une autre approche consiste à utiliser l'dependency injection, auquel cas les objects n'ont même pas besoin d'être des singletons, dans la plupart des cas. Vous pouvez instancier un graphe d'object de composants collaborants pour un cas d'utilisation donné qui ira et disparaîtra selon les besoins. Cela a l'avantage d'utiliser less de memory sur les périphériques à ressources limitées.

C'est une idée fausse commune que vous avez besoin d'une bibliothèque pour utiliser l'dependency injection. Vous ne le faites pas. Cela peut aider cependant. J'ai créé un conteneur d'dependency injection appelé Typhoon .

Notifications

Une autre façon d'get une collaboration souple entre les classs consiste à utiliser des notifications .