Objective-C Singleton超类?

Nos*_*rac 0 objective-c

我正在尝试编写一个我可以子类化为具有即时单例的类.这是我到目前为止所拥有的.它的工作原理是它的一个子类通过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)

Lil*_*ard 7

你为什么要烦恼这一切?如果你想通过覆盖强制执行超单的行为-retain,-release,-retainCount,和+allocWithZone:那么你正在做的事情完全没有必要的.更简单的只是提供一种+sharedInstance方法,而不做任何其他事情.如果用户真的想打电话+alloc/ -init,他们可以,它只是不会做得好.有关框架中此类单例的示例,请查看NSUserDefaultsNSFileManager(虽然在后者的情况下,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)

  • 完全同意; 我发现单例类中所有方法的覆盖都是相当愚蠢的.****************************************************************对于你自己的东西?把事情简单化!! (2认同)