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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yaozeyang_2014 中级黑马   /  2014-4-26 20:01  /  1456 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yaozeyang_2014 于 2014-5-7 10:33 编辑

什么是单例设计模式?是用类方法(静态方法)快速创建对象的意思吗?最好有例子。。感谢!!

4 个回复

倒序浏览
本帖最后由 cnchenys 于 2014-4-26 20:33 编辑

单例设计模式(singleton)就是不管你创建多少个对象,都指向同一块内存.即整个程序运行中,该对象只有一份.一般重量级(占用大量内存)而且仅需一份的对象,都会用单例设计模式设计.JAVA中也有单例设计模式,JAVA种只要private构造方法,再写一个instance方法,判断是否已存在,不存在则new. OC种也类似,单还要考虑计数器,所以OC种稍微麻烦点:

完成思路是提供一个实例化方法,
+ (Single *)instance{

    @synchronized(self){    // 线程安全
        if(!instance){


            /* 这里不是使用alloc,而是调用[[super allocWithZone:NULL] init ] ,为什么是super而不是self呢?
             这是因为已经在self中冲在了基本对的分配方法,所以需要借用父类的(NSobject)的功能帮助处理底层内存分配的杂务;
             */
            instance = [[super allocWithZone:NULL] init];
        }
    }
    return instance;
}



并重写NSObject种的一些方法:
/ 覆盖NSObject方法
+ (id)allocWithZone: (struct _NSZone * )zone{

    return [[self instance] retain];
}

- (id)copyWithZone: (NSZone * )zone{
    return self;
}

- (id)retain{
    return self;
}

- (NSUInteger)retainCount{
    return UINT_MAX;    // 无穷大的数,表示不能释放
}

- (id)autorelease{
    return self;
}

- (oneway void)release{

}



评分

参与人数 1技术分 +1 收起 理由
脸皮猴 + 1

查看全部评分

回复 使用道具 举报
单例模式是一种软件编码过程中的设计模式,面向对象的语言如java,oc,C#,都可以实现这种设计模式,其实就是一种编码方式。这种编码方式可以保证一个类仅有一个实例,并提供一个访问它的全局访问点。我的OC正在学习,所以只能提供java代码了,我先实现思路应该类似的
public class Singleton{
private static Singleton instance=null;     //在自己的类内部实现一个静态的实例
private Singleton(){

}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();    //只有instance空的时候才会新建一个实例
}
return instance;
}
}
回复 使用道具 举报
gaoxinglei123 来自手机 中级黑马 2014-4-26 22:57:16
板凳
单例模式是一种设计模式。主要就是一个类只能创建一个内存实例。java中是通过私有化构造方法来实现的。
回复 使用道具 举报
  1. 单例设计模式就是保证系统只有一个实例而且该实例易于外界访问
  2. //.h文件
  3. @interface Singleton : NSObject
  4. +(instancetype) sharedInstance;
  5. @end


  6. //.m文件
  7. @interface Singleton ()
  8. @end

  9. static Singleton *_singleton;

  10. @implementation Singleton



  11. +(instancetype) sharedInstance//快速得到对象方法
  12. {
  13.     if(_singleton==nil)
  14.     {
  15.         _singleton = [[Singleton alloc]init];
  16.     }

  17.     return _singleton;
  18. }

  19. +(id)allocWithZone:(struct _NSZone *)zone//重写使用GCD保证只执行一次
  20. {
  21.     static dispatch_once_t onceToken;
  22.     dispatch_once(&onceToken, ^{
  23.         _singleton = [super allocWithZone:zone];
  24.     });
  25.     return _singleton;
  26. }
复制代码


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马