我正在尝试编写一个我可以子类化为具有即时单例的类.这是我到目前为止所拥有的.它的工作原理是它的一个子类通过sharedInstance调用另一个子类,这会导致一个最终耗尽内存的巨大循环.
有任何想法吗?
static NSMutableDictionary *sharedInstances = nil;
@implementation Singleton
+ (Singleton*)sharedInstance
{
[Singleton initSharedInstances];
Class myClass = [self class];
Singleton * sharedInstance = [sharedInstances objectForKey:myClass];
@synchronized(myClass)
{
if (sharedInstance == nil)
{
sharedInstance = [[myClass alloc] init];
[sharedInstances setObject:sharedInstance forKey:myClass];
}
}
return sharedInstance;
}
+ (void) initSharedInstances
{
if (sharedInstances == nil)
{
sharedInstances = [[NSMutableDictionary alloc] init];
}
}
@end
Run Code Online (Sandbox Code Playgroud)
你为什么要烦恼这一切?如果你想通过覆盖强制执行超单的行为-retain,-release,-retainCount,和+allocWithZone:那么你正在做的事情完全没有必要的.更简单的只是提供一种+sharedInstance方法,而不做任何其他事情.如果用户真的想打电话+alloc/ -init,他们可以,它只是不会做得好.有关框架中此类单例的示例,请查看NSUserDefaults和NSFileManager(虽然在后者的情况下,Apple实际上建议您忽略共享实例并分配/初始化您自己的实例NSFileManager).
为了完成这个简单的共享实例,你需要做的只是在单例类中实现以下内容:
+ (id)sharedInstance {
static MyClass sharedInstance;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
//sharedInstance = [[MyClass alloc] init];
sharedInstance = [MyClass alloc];
sharedInstance = [sharedInstance init];
});
return sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1049 次 |
| 最近记录: |