在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;
}
参考