iOS 5中的Objective-C单例模式

前端之家收集整理的这篇文章主要介绍了iOS 5中的Objective-C单例模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在阅读很多关于如何在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:方法已经很久很久了)

猜你在找的iOS相关文章