Object C和java单例实现比较

在java中,我们一般如下实现单例

public class SingletonClass {
    private static SingletonClass _instance;

    private SingletonClass() {

    }

    public static SingletonClass getInstance() {
        //懒加载
        if (_instance == null) {
            _instance = new SingletonClass();
        }
        return _instance;
    }

    public static void releaseInstance() {
        _instance = null;
    }
}

SingletonClass只会有一个实例,而且只能通过getInstance获取。_instance实例是挂载在类下面的,我们可以调用releaseInstance方法将_instance置为null,这样等GC执行的时候,就能将实例释放掉。

下面我们看看OC是怎么实现单例的

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface SingletonClass : NSObject
+ (instancetype)shareSingletonClass;
@end

NS_ASSUME_NONNULL_END
#import "SingletonClass.h"

@implementation SingletonClass

+ (instancetype)shareSingletonClass {
    static id _instance;
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

@end

使用的时候,按照“约定”调用shareSingletonClass方法获取实例,其实它还是可以按照常规方法创建出实例的,这是第一个问题,没有严格满足单例的定义。第二个问题是,如果有需要释放这个单例的需求,要怎么做呢?可能我是初学者,这种实现方案,我是不知道怎么做。

为了实现释放单例的需求,我把实例挂载到一个一直存在的另一个对象下,然后根据时机释放就行,比如下面的实现。

+ (SHFloatWindowController *)sharedController
{
    AppDelegate* delegate = (AppDelegate*)[[NSApplication sharedApplication] delegate];
    SHFloatWindowController *instance = delegate.floatController;
    if (!instance) {
        instance = [self windowController];
        delegate.floatController = instance;
    }
    
    return instance;
}

+(instancetype)windowController {
    return [[SHFloatWindowController alloc] initWithWindowNibName:@"FloatTipsWindow"];
}

+(void)releaseSharedController {
    AppDelegate* delegate = (AppDelegate*)[[NSApplication sharedApplication] delegate];
    delegate.floatController = nil;
}

 

 

参考

Object-C 中的单例模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值