单例模式

单例模式,用于一个类始终只有一个实例,不管copy还是retain还是alloc等等,也不能被release,直到程序结束,都只有一个实例。

  1.有的东西只能有一个,那就必须用单例;

  2.单例的好处就是不会有多余的实例,所以节约内存;

  3.因为只有一个单例,所以易于管理多线程对它的访问。

 
 
  1. #import <Foundation/Foundation.h>
  2. @interface User : NSObject<NSCopying> //拷贝协议表明该对象可被拷贝,尽管都是同一个(因为是单例)
  3. @property(nonatomic,copy) NSString *name;
  4. @property(nonatomic,copy) NSString *email;
  5. +(id)shareUser; //一般用share或者default做前缀,易于阅读标记为单例共享方法
  6. @end
 
 
  1. #import "User.h"
  2. static User *user1=nil;   //先定义一个空得静态实例
  3. @implementation User
  4. +(id)shareUser{
  5.    @synchronized(self){    //线程锁,防止多线程访问冲突
  6.        if (user1==nil) {    //判断这个实例是否为空,即是否已被创建
  7.            user1=[[[self class ]alloc]init];    //如果没被创建,就初始化一个
  8.            }
  9.        }
  10.    return user1;    //如果已存在,则不创建,直接返回即可
  11.    }
  12.                   //以下都是防止实例不是唯一的一些方法,是通用格式,不必死记硬背,可以直接拷贝到任何单例模式中
  13.                   //这是在调用alloc时可防止重复创建实例
  14. +(id)allocWithZone:(NSZone *)zone{
  15.    if (user1==nil) {
  16.        user1=[super allocWithZone:zone];
  17.        }
  18.    return user1;
  19.    }
  20. //这是在拷贝对象时防止重复创建
  21. -(id)copyWithZone:(NSZone *)zone{
  22.    return user1;
  23.    }
  24. //这是在retain对象时防止重复创建,当然在ARC开启时可省略这个
  25. -(id)retain{
  26.    return user1;
  27.    }
  28. //在release时什么都不做,因为一共就一个实例,不重复引用,所以不能release
  29. -(oneway void)release{        //除了返回单例,什么都不做
  30.    
  31.    }
  32. //在autorelease时,返回实例,在ARC下客省略
  33. -(id)autorelease{
  34.    return user1;
  35.    }
  36. //返回的时无符号整型,即大于0的数字,在ARC下可省略
  37. -(NSUInteger)retainCount{            //替换掉引用计数——这样就永远都不会release这个单例?
  38.    return UINT_MAX;
  39.    }
  40. @end
 
 
  1. #import <Foundation/Foundation.h>
  2. #import "User.h"
  3. int main(int argc, const char * argv[]){
  4.    @autoreleasepool {
  5.        User *user1=[User shareUser];
  6.        User *user2=[User shareUser];
  7.        User *user3=[[User alloc]init];
  8.        User *user4=[user1 copy];
  9.        NSLog(@"%@,%@,%@,%@",user1,user2,user3,user4);
  10.                  //四个对象是同一个,看地址可知,是同一个,即是单例
  11.        }
  12.    return 0;
  13.    }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值