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

来源:互联网 发布:社会工程学资源知乎 编辑:程序博客网 时间:2024/05/22 07:01

———-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
原创粉丝点击