Objective-C : Le Singleton facile

Florent Morin

Le singleton est très utilisé en Objective-C afin d'accéder à un objet partagé.
Seulement, cela peut être fastidieux à intégrer.

- Titre : Objective-C : Le Singleton facile

- Auteur : Florent Morin

- Parution : 1 janvier 2011

- Mise à jour : 31 mars 2020

- Licence : Copyright ® 2011 Florent Morin. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Le Singleton facile

- II. Le modèle de fichier (XCode 3)

I - Le Singleton facile

Le singleton est très utilisé en Objective-C afin d'accéder à un objet partagé. Seulement, cela peut être fastidieux à intégrer.

Pour éviter le code à rallonge, voici un fichier qui pourra vous être utile.

KSSingleton.h

1. //

2. //  KSSingleton.h

3. //

4. //  Created by Florent Morin on 27/03/10.

5. //  Copyright 2010 Kaeli Soft.

6. //

7. //  http://www.kaelisoft.fr

8. //

11. /*

12. * __ Integration __ (minimal)

13. *

14. * #import "KSSingleton.h"

15. *

16. * @interface MySingleton {

17. * ...

18. * }

19. *

20. * KS_SINGLETON_INTERFACE(MySingleton)

21. *

22. * ...

23. *

24. * @end

25. *

26. *

27. * @implementation MySingleton

28. *

29. * KS_SINGLETON_IMPLEMENTATION(MySingleton)

30. *

31. * ...

32. *

33. * @end

34. *

35. */

37. /*

38. * __ Initialization __ (optional)

39. *

40. * @interface MySingleton {

41. * }

42. *

43. * ...

44. *

45. * - (void)initialization;

46. *

47. * @ end

48. *

49. * @implementation MySingleton

50. *

51. * - (void)initialization {

52. * }

53. *

54. * @end

55. *

56. */

58. /*

59. * __ Usage __

60. *

61. * MySingleton *s = [MySingleton sharedMySingleton];

62. *

63. */

65. #define KS_SINGLETON_INTERFACE(singletonclass)

66. + (singletonclass *)shared##singletonclass;

68. #define KS_SINGLETON_IMPLEMENTATION(singletonclass)

70. static singletonclass *shared##singletonclass = nil;

72. + (singletonclass *)shared##singletonclass {

73. if (shared##singletonclass == nil) {

74. shared##singletonclass = [[super allocWithZone:NULL] init];

75. if ([shared##singletonclass respondsToSelector:@selector(initialization)]) {

76. [shared##singletonclass performSelector:@selector(initialization)];

77. }

78. }

80. return shared##singletonclass;

81. }

83. + (id)allocWithZone:(NSZone *)zone {

84. return [[self shared##singletonclass] retain];

85. }

87. - (id)copyWithZone:(NSZone *)zone {

88. return self;

89. }

91. - (id)retain {

92. return self;

93. }

95. - (NSUInteger)retainCount {

96. return NSUIntegerMax;

97. }

99. - (void)release {

100. }

102. - (id)autorelease {

103. return self;

104. }

Son usage est relativement simple.

MySingleton.h

1. #import

3. #import "KSSingleton.h"

5. @interface MySingleton : NSObject {

6. NSInteger integerValue;

7. }

9. @property (assign) NSInteger integerValue;

11. KS_SINGLETON_INTERFACE(MySingleton)

13. @end

MySingleton.m

1. #import "MySingleton.h"

3. @interface MySingleton (hidden)

5. - (void)initialization;

7. @end

9. @implementation MySingleton (hidden)

11. - (void)initialization {

12. integerValue = 12;

13. }

15. @end

17. @implementation MySingleton

19. @synthesize integerValue;

21. KS_SINGLETON_IMPLEMENTATION(MySingleton)

23. @end

Notez que l'implémentation de - (void)initialization; est facultative.
Elle peut cependant être utile à l'initialisation du singleton.

Ensuite, l'utilisation dans le code se fait ainsi :

MySingleton *s = [MySingleton sharedSingleton];

L'appel au singleton se fait toujours via [MaClasse sharedMaClasse].

Vous pouvez utiliser cette fonctionnalité à titre personnel et/ou professionnel, du moment que vous conservez son en-tête intact.

Vous pouvez également télécharger le Projet d'exemple disponible ici.

II - Le modèle de fichier (XCode 3)

Si vraiment vous souhaitez gagner du temps, utilisez directement notre modèle de fichier.

La procédure d'installation est simple.

Placez-vous, dans votre répertoire « Bibliothèque » (Library). Allez donc à l'emplacement /Users/utilisateur/Library/Application Support/Developer/Shared/XCode.

S'il n'existe pas, créez le répertoire File Templates. Placez-vous dans ce répertoire. Créez le répertoire Kaeli Soft.

Téléchargez l'archive Kaeli Soft. Décompressez son contenu dans Kaeli Soft.

Relancez XCode.

Pour l'utiliser : File -> New File… puis sélectionnez, dans User Templates, Kaeli Soft.

Vous aurez alors la possibilité de créer un Singleton. Appuyez sur Next. Définissez le nom du fichier (qui sera le nom de la classe) et appuyez sur Finish.

Votre singleton est prêt !