Multiton 是 singleton 的更佳替代品。它更灵活,并且编写实现时需要的代码行更少。
特性
ABMultitonProtocol
包含到类接口中,即可建立一个类的共享实例。无需实现!init
方法(带参数)创建共享实例。shared
返回。警告
这并不是经典 multiton 的实现。此实现使用实例的
类名
作为访问实例的键
。
添加到 Podfile
pod 'ABMultiton'
类应遵守 ABMultitonProtocol
#import "ABMultitonProtocol.h"
...
@interface MyClass : ParentClass <ABMultitonProtocol>
...
@end
这就是全部!ABMultiton
将在运行时添加 shared
方法的实现。您可以通过这种方式访问共享实例:
[MyClass.shared myMethod];
ABMultiton
如此实现 shared
方法:
return [[MyClass alloc] init];
如果需要使用一些自定义的 init
方法,您应自己按这种方式实现 shared
方法
#import "ABMultiton.h"
...
+ (instancetype)shared
{
return [ABMultiton sharedInstanceOfClass:self.class withInitBlock:^id
{
MyClass *instance = [[MyClass alloc] initWithArgument:value];
instance.someProperty = propertyValue;
return instance;
}];
}
在单元测试中非常有用。因此,如果不使用共享实例,可以通过此调用删除它:
[MyClass removeShared];
此方法也是由 ABMultiton
在运行时注入的。以下是方法实现:
[ABMultiton removeInstanceOfClass:MyClass.class];
有时您不需要所有应用程序周期的共享实例。并且您可能希望在低内存时释放一些共享实例。这很简单。只需实现 ABMultitonProtocol
的可选方法 isRemovableInstance
@implementation MyClass
...
- (BOOL)isRemovableInstance
{
return YES;
}
此实例将在内存警告时释放。或者,您可以手动通过此调用释放所有此类实例:
[ABMultiton purgeRemovableInstances];
BOOL isExists = [ABMultiton containsInstanceOfClass:[MyClass class]];
使用 ABMultiton
是线程安全的。
请尽量不要为类创建共享实例。所谓的“单例狂热”是一个广为人知的反模式。
ABMultiton 包含子模块 SetInstance
。它允许替换或为将在 shared
方法调用中返回的类添加实例。这对于单元测试非常有用。
将 pod 'ABMultiton'
替换为 pod 'ABMultiton/SetInstance'
[ABMultiton setInstance:customInstance forClass:MyClass.class];
关注 ABMultiton 的更新,请关注 @okolodev