C'est ainsi que je code singletonPattern en tant que "parent". Fondamentalement, j'ai utilisé une combinaison de protocole et de catégorie.
La seule chose que je ne peux pas ajouter est un nouveau "ivar" cependant, je peux le pousser avec un objet associé.
#import <Foundation/Foundation.h>
@protocol BGSuperSingleton
+(id) singleton1;
+(instancetype)singleton;
@end
@interface NSObject (singleton) <BGSuperSingleton>
@end
static NSMutableDictionary * allTheSingletons;
+(instancetype)singleton
{
return [self singleton1];
}
+(id) singleton1
{
NSString* className = NSStringFromClass([self class]);
if (!allTheSingletons)
{
allTheSingletons = NSMutableDictionary.dictionary;
}
id result = allTheSingletons[className];
//PO(result);
if (result==nil)
{
result = [[[self class] alloc]init];
allTheSingletons[className]=result;
[result additionalInitialization];
}
return result;
}
-(void) additionalInitialization
{
}
Chaque fois que je veux qu'une classe "hérite" de ce BGSuperSingleton, je fais simplement:
#import "NSObject+singleton.h"
et ajouter @interface MyNewClass () <BGSuperSingleton>