黑马程序员——OC单例模式入门
来源:互联网 发布:社会工程学资源知乎 编辑:程序博客网 时间:2024/05/22 07:01
———-android培训、Java培训、iOS培训,期待与您交流———-
一、基本概念
什么是单例模式
单例模式的意图是使类对象成为系统中唯一的实例。提供一个访问点,成为其他类共享数据的中转站。
单例设计模式的要点:
某个类只能有一个实例;
他必须自行创建这个对象;
必须自行向整个系统提供这个实例;
为了保证实例的唯一性,我们必须将
- -(id)copyWithZone:(NSZone *)zone
- +(id)allocWithZone:(NSZone *)zone
- -(id)retain
- -(NSUInteger)retainCount
- -(oneway void)release
- -(id)autorelease
的实现方法进行覆盖;
这个方法必须是一个静态类;
二、实现单例模式
步骤思路:
- 创建一个包含想要共享的数据的类
- 为这个类添加一个类方法,该方法返回一个该类的静态实例,并且当已经存在这个静态实例时,不重复创建。
- 重写可能导致创建新的实例或释放当前实例的方法
三、代码举例
创建一个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
- 黑马程序员——OC单例模式入门
- 黑马程序员——单例模式
- 黑马程序员—单例设计模式
- 黑马程序员—单例设计模式
- 黑马程序员—单例设计模式
- 【黑马程序员】oc中的单例设计模式
- 黑马程序员 OC中的单例设计模式
- 黑马程序员----OC学习之单例模式
- 黑马程序员--设计模式——单例设计模式
- 黑马程序员-JAVASE入门(面向对象,单例模式)
- 黑马程序员-JAVA SE入门(单例模式)
- 黑马程序员————单例设计模式
- 黑马程序员———java 单例设计模式
- 黑马程序员———单例模式
- 黑马程序员——单例设计模式
- 黑马程序员——单例设计模式
- 黑马程序员——单例设计模式
- 黑马程序员——多线程和单例设计模式
- Internet of Lights and Switches(MAP记录+二分) 2015年湖南省赛第 I 题
- Spring注解
- Unity+Vuforia 自动对焦功
- Android 手势检测实战 打造支持缩放平移的图片预览效果(下)
- Tomcat Error Page配置
- 黑马程序员——OC单例模式入门
- Ubuntu开机加载自定义脚本
- MySQL 性能优化的最佳20多条经验分享
- 声明fakeHead
- 数据结构:线索树之基本例程(1)
- C# 实例一 文件切合和合并
- cocos2dlua-场景
- Appium 自动化用例设计(TESTNG 篇)
- 移动AR技术后置摄像头实时获取