A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© allen0206 中级黑马   /  2014-10-17 19:29  /  729 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。
单态模式在Java、C++中很常用,在Cocoa里,也可以实现。
但是,
Objective-C的单例模式绝对和你所想象不一样,他的写法和你所见过的所有语言的写法都不一样。

官方建议

由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
    @synchronized(self){
       if(sharedGizmoManager == nil) {
          [[selfalloc] init]; // assignment not done here
       }
    }
    returnsharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
    @synchronized(self){
       if(sharedGizmoManager == nil) {
         sharedGizmoManager = [superallocWithZone:zone];
          returnsharedGizmoManager;  //assignment and return on first allocation
       }
    }
    return nil; //on subsequentallocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone
{
    return self;
}
- (id)retain
{
    return self;
}
- (unsigned)retainCount
{
    returnUINT_MAX;  //denotes an objectthat cannot be released
}
- (void)release
{
    //do nothing
}
- (id)autorelease
{
    return self;
}
复制代码
程序员都是偷懒的,现在流行使用一个宏定义来搞定这许多的事,而且考虑的更加周全。
单例包含以下接口
+ (MyClass*) sharedInstance;
+ (void) purgeSharedInstance;
复制代码
调用sharedInstance会创建并返回单例
调用purgeSharedInstance会销毁单例
手动调用alloc也可以保证是单例,你可以这样调用
[[MyClass alloc] initWithParam:firstParamsecondParam:secondParam];
复制代码
只是要保证在sharedInstance之前调用,因为只有一次创建机会。
下面是使用宏的写法“
MyClass.h:
========================================
    #import"SynthesizeSingleton.h"
    @interface MyClass:SomeSuperclass
    {
       ...
    }
   SYNTHESIZE_SINGLETON_FOR_CLASS_HEADER(MyClass);
    @end
复制代码
========================================


  MyClass.m:
========================================
    #import "MyClass.h"
    @implementationMyClass
   SYNTHESIZE_SINGLETON_FOR_CLASS(MyClass);
    ...
    @end
复制代码
========================================、

评分

参与人数 1技术分 +1 收起 理由
星河鹭起 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马