黑马程序员——OC单例模式入门

———-android培训、Java培训、iOS培训,期待与您交流———-

一、基本概念

什么是单例模式

单例模式的意图是使类对象成为系统中唯一的实例。提供一个访问点,成为其他类共享数据的中转站。

单例设计模式的要点:

  1. 某个类只能有一个实例;

  2. 他必须自行创建这个对象;

  3. 必须自行向整个系统提供这个实例;

  4. 为了保证实例的唯一性,我们必须将

      • -(id)copyWithZone:(NSZone *)zone
      • +(id)allocWithZone:(NSZone *)zone
      • -(id)retain
      • -(NSUInteger)retainCount
      • -(oneway void)release
      • -(id)autorelease

    的实现方法进行覆盖;

  5. 这个方法必须是一个静态类;

二、实现单例模式

步骤思路:

  1. 创建一个包含想要共享的数据的类
  2. 为这个类添加一个类方法,该方法返回一个该类的静态实例,并且当已经存在这个静态实例时,不重复创建。
  3. 重写可能导致创建新的实例或释放当前实例的方法

三、代码举例

创建一个SingletenTool类,此例中,使用该单例共享num和name值。

/*******SingletenTool.h文件*******/
#import <Foundation/Foundation.h>

@interface SingletenTool : NSObject
@property (nonatomic,assign)int num;//共享的num值
@property (nonatomic,copy)NSString *name;//共享的name值
+(instancetype)shareInstance;
@end
/*******SingletenTool.m文件********/
#import "SingletenTool.h"

static SingletenTool *share = nil;//存储共享数据的静态实例

@implementationSingletenTool
+(instancetype)shareInstance{
    if (share == nil) {
       share = [[SingletenTool alloc]init];
       return share;//没有创建SingletenTool实例时创建该实例
    }
    return share;//如果已经创建该实例则直接返回该实例
}

-(id)copyWithZone:(NSZone*)zone{
    return self;//调用copy方法时直接返回该实例,避免通过copy创建新的实例
}

+(id)allocWithZone:(NSZone*)zone{
    @synchronized(self) {
      if (share == nil) {
       share = [superallocWithZone:zone];
       return share;
       }
    }
    return share;//重写alloc避免通过alloc创建新的实例
}

-(id)retain{
    return self;//使得该实例在MRC模式下不能retain,单例在创建时引用计数为1,知道程序结束引用计数归0,被销毁,程序运行期间始终保持引用计数为1
}

-(NSUInteger)retainCount{
    return NSUIntegerMax;
}

-(oneway void)release{//不允许单例对象在程序运行期间release,避免被意外销毁
}

-(id)autorelease{
    return self;//不允许单例对象加入自动释放池
}
@end

在使用该类共享数据时,只需要调用+(instancetype)shareInstanc方法即可。例如,假设已经有Dog类和Person类,在Dog类中定义run方法设定num和name的值,使用Person输出。

/*******Dog.m文件*******/
#import "Dog.h"

@implementation Dog
-(void)run{
    SingletenTool *st = [SingletenTool shareInstance];
    st.name = @"abc";
    st.num = 100;//将要共享的值存入单例对象中
}
@end
/******Person.m文件********/
#import "Person.h"

@implementation Person
-(void)run{
    SingletenTool *st = [SingletenTool shareInstance];
    NSLog(@"%d\t%@",st.num,st.name);
}
@end
/******main.m文件*******/

int main(intargc, const char* argv[]) {
    @autoreleasepool {
       Person *p = [Personnew];
       Dog *d = [Dognew];
       [d run];
       [p run];//->100  abc
    }
    return 0;
}

SingletenTool就是一个数据中转站,将需要在不同类之间共享的数据存储在SingletenTool中,就可以用方便的进行数据共享,而不需要在共享的类之间频繁的进行数据的传递。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值