码迷,mamicode.com
首页 > 其他好文 > 详细

OC学习-单例设计模式的理解、案例和简单总结

时间:2015-07-21 01:16:22      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

    • 单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例。为什么?有什么好处?

      简单来说:

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

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

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

      d:其他的原因……省略

      我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?

      (1)User.h

       

      1.#import <Foundation/Foundation.h>
      2. 
      3.@interface User : NSObject<NSCopying> //拷贝协议表明该对象可被拷贝,尽管都是同一个(因为是单例)
      4.@property(nonatomic,copy) NSString *name;
      5.@property(nonatomic,copy) NSString *email;
      6.//一般用share或者default做前缀,易于阅读标记为单例共享方法
      7.+(id)shareUser;
      8.@end

      (2)User.m

       

       

      01.#import "User.h"
      02.static User *user1=nil; //先定义一个空得静态实例
      03.@implementation User
      04.+(id)shareUser{
      05.@synchronized(self){ //线程锁,防止多线程访问冲突
      06.if (user1==nil) { //判断这个实例是否为空,即是否已被创建
      07.user1=[[[self class ]alloc]init];//如果没被创建,就初始化一个
      08.}
      09.}
      10.return user1; //如果已存在,则不创建,直接返回即可
      11.}
      12. 
      13.//以下都是防止实例不是唯一的一些方法,是通用格式,不必死记硬背,可以直接拷贝到任何单例模式中
      14.//这是在调用alloc时可防止重复创建实例
      15.+(id)allocWithZone:(NSZone *)zone{
      16.if (user1==nil) {
      17.user1=[super allocWithZone:zone];
      18.}
      19.return user1;
      20.}
      21.//这是在拷贝对象时防止重复创建
      22.-(id)copyWithZone:(NSZone *)zone{
      23.return user1;
      24.}
      25.//这是在retain对象时防止重复创建,当然在ARC开启时可省略这个
      26.-(id)retain{
      27.return user1;
      28.}
      29.//在release时什么都不做,因为一共就一个实例,不重复引用,所以不能release
      30.-(oneway void)release{
      31. 
      32.}
      33.//在autorelease时,返回实例,在ARC下客省略
      34.-(void)autorelease{
      35.return user1;
      36.}
      37.//返回的时无符号整型,即大于0的数字,在ARC下可省略
      38.-(NSUInteger)retainCount{
      39.return UINT_MAX;
      40.}
      41.@end

      (3)main.m

       

       

      01.#import <Foundation/Foundation.h>
      02.#import "User.h"
      03. 
      04.int main(int argc, const char * argv[])
      05.{
      06.@autoreleasepool {
      07.User *user1=[User shareUser];
      08.User *user2=[User shareUser];
      09.User *user3=[[User alloc]init];
      10.User *user4=[user1 copy];
      11.NSLog(@"%@,%@,%@,%@",user1,user2,user3,user4);
      12.}
      13.return 0;
      14.}

      (4)上面四个对象是否是同一个,看地址可知,是同一个,即事单例

      <User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>

      总结:

      a:单例设计模式用得比较多

      b:不仅在OC中又,JAVA等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的
       

OC学习-单例设计模式的理解、案例和简单总结

标签:

原文地址:http://www.cnblogs.com/thiswinter/p/4178843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!