我一直在阅读很多关于如何在Objective-C中实现单例的线程和博客文章,其中几个可能有点被淘汰(2010年或更早版本),似乎人们对这个问题有不同的看法.苹果是否有关于实施单例的文档?我找不到它如果是这样,有人可以告诉我哪里?
我需要一个具有公共和私有变量的类的单例.目前,这是我对这样的类的实现:
@interface MySingleton () @property (strong,nonatomic) NSString *state; @end @implementation MySingleton @synthesize state = _state; @synthesize count = _count; static MySingleton *sharedObject = nil; + (MySingleton *)sharedInstance { static dispatch_once_t _singletonPredicate; dispatch_once(&_singletonPredicate,^{ sharedObject = [[super allocWithZone:nil] init]; }); return sharedObject; } + (id)allocWithZone:(NSZone *)zone { return [self sharedInstance]; }
应该是推荐的方式吗?我应该如何初始化公共和私有的实例变量?
关于单例的另一个问题是:这会产生内存泄漏吗?在iOS中实际推荐使用单身吗?
谢谢
解决方法
以上是正确的,以及@ miho关于在sharedInstance方法中包含静态对象的评论.但是没有理由重写allocWithZone :. ObjC中的单身人士通常是“共享的”,而不是强制的.你可以自由地创建一个“单身人士”的其他例子.如果创建其他实例是非法的,那么您应该使init执行NSAssert,而不是在allocWithZone中愚弄调用者:.如果你的单例是可变的(大部分是),你绝对不应该重写allocWithZone:这样.
Another issue I’d like to make clear about singleton is: will this generate a memory leak?
不,此对象永远不会被释放,但它始终可以访问.这不是泄漏.
Is the use of singletons actually recommended in iOS?
是的,这是一个非常常见的模式,遍及可可框架.也就是说,开发人员最近开始变得有些受欢迎的各种其他模式.依赖注入越来越受到关注,尽管我经常看不到它.减少对单身人士的依赖可以提高可测试性,最近我一直在尝试如何在我的代码中消除其中的一些成功.但是他们在可可中有一个悠久而自豪的历史,我不认为他们是一个问题.
编辑:你的代码中有一个实际的错误.你应该调用[[self alloc] init],而不是[[super alloc] init].没有任何理由可以调用allocWithZone :,只需使用alloc. (时间… WithZone:方法已经很久很久了)