单例模式
来源:互联网 发布:3000元左右手机 知乎 编辑:程序博客网 时间:2024/06/05 04:10
创建一个学生类
在Student.h里
#import <Foundation/Foundation.h>@interface Student : NSObject@property (copy,nonatomic) NSString * name;@property (assign,nonatomic) int age;+(Student *) getInstance;@end
Student.m实现类
#import "Student.h"@implementation Student//1、创建一个全局实例,并且初始化为nilstatic Student * stu=nil;//2、实现工厂方法,然后返回单一一个对象+(Student *)getInstance{ if (stu==nil) { stu = [[Student alloc]init]; } return stu; //是否需要autorelease?不用,因为全局使用的单例不需要释放}//3、为了防止alloc或new来创建新的实例,需要重写allocWithZone方法+(id)allocWithZone:(struct _NSZone *)zone{ if (stu==nil) { stu = [[super allocWithZone:zone]init]; } return stu;}//4、为了防止copy创建新的实例,重写copyWithZone-(id)copyWithZone:(NSZone *)zone{ return self;}//5.1、重写retainCount方法,防止被dealloc,此方法中返回最大值-(NSUInteger)retainCount{ return NSUIntegerMax;}//5.2、重写retain方法,因为单例不释放,所以引用计数器变化没有意义。-(id)retain{ return self;}//5.3重写release方法,因为单例不释放,所以引用计数器变化没有意义。-(oneway void)release{ }//5.4 重写autorelease方法,因为单例不释放-(id)autorelease{ return self;}@end
在Main函数里测试一下
#import <Foundation/Foundation.h>#import "Student.h"int main(int argc, const char * argv[]){ @autoreleasepool { Student * s1 = [[Student alloc]init]; Student * s2 = [Student getInstance]; Student * s3 = [Student getInstance]; Student * s4 = [s3 copy]; NSLog(@"%p",s1); NSLog(@"%p",s2); NSLog(@"%p",s3); NSLog(@"%p",s4); } return 0;}
以上是一个安全的单例模式,不安全单例只需要创建一个全局静态实例和提供工厂方法对该全局实例进行访问。
0 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- 【剑指offer】面试题4替换空格
- cocos3.1.1+vs2012+cocosstudio
- 移动云服务平台 推送工具 OpenMobster
- idea+tomcat+tomcat运行项目(一)
- 16 oj 对象数组求最大值
- 单例模式
- 雾山的Robotium学习笔记---使用junitreport导出测试报告
- 移动互联网3.0时代【逆向付费】---微乐
- 设计模式—原型模式
- 12条很有用的Chrome浏览器命令
- 操作系统笔试、面试题
- 用好赏识教育的3条准则
- setOutputFormat called in an invalid state: 1
- c++ socket编程