单例模式
2015-12-10 14:14
176 查看
这个是从视频中看来的,现在记录在这里
#import <Foundation/Foundation.h>
@interface Ticket :
NSObject
// 实例化票据的单例
+ (Ticket *)sharedTicket;
// 在多线程应用中,所有被抢夺资源的属性需要设置为原子属性
// 系统会在多线程抢夺时,保证该属性有且仅有一个线程能够访问
// 注意:使用atomic属性,会降低系统性能,在开发多线程应用时,尽量不要资源
// 另外,atomic属性,必须与@synchronized(同步锁)一起使用
// 票数
@property (assign,
atomic) NSInteger tickets;
@end
#import "Ticket.h"
static Ticket *SharedInstance;
@implementation Ticket
/**
实现单例模型需要做三件事情
1. 使用全局静态变量记录住第一个被实例化的对象
static Ticket *SharedInstance
2. 重写allocWithZone方法,并使用dispatch_once_t,从而保证在多线程情况下,
同样只能实例化一个对象副本
3. 建立一个以shared开头的类方法实例化单例对象,便于其他类调用,同时不容易引起歧义
同样用dispatch_once_t确保只有一个副本被建立
关于被抢夺资源使用的注意事项
在多线程应用中,所有被抢夺资源的属性需要设置为原子属性
系统会在多线程抢夺时,保证该属性有且仅有一个线程能够访问
注意:使用atomic属性,会降低系统性能,在开发多线程应用时,尽量不要资源
另外,atomic属性,必须与@synchronized(同步锁)一起使用
*/
// 使用内存地址实例化对象,所有实例化方法,最终都会调用此方法
// 要实例化出来唯一的对象,需要一个变量记录住第一个实例化出来的对象
+ (id)allocWithZone:(NSZone *)zone
{
// 解决多线程中,同样只能实例化出一个对象副本
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [super
allocWithZone:zone];
});
return
SharedInstance;
}
// 建立一个单例对象,便于其他类调用
+ (Ticket *)sharedTicket
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [[Ticket
alloc]init];
});
return
SharedInstance;
}
@end
#import <Foundation/Foundation.h>
@interface Ticket :
NSObject
// 实例化票据的单例
+ (Ticket *)sharedTicket;
// 在多线程应用中,所有被抢夺资源的属性需要设置为原子属性
// 系统会在多线程抢夺时,保证该属性有且仅有一个线程能够访问
// 注意:使用atomic属性,会降低系统性能,在开发多线程应用时,尽量不要资源
// 另外,atomic属性,必须与@synchronized(同步锁)一起使用
// 票数
@property (assign,
atomic) NSInteger tickets;
@end
#import "Ticket.h"
static Ticket *SharedInstance;
@implementation Ticket
/**
实现单例模型需要做三件事情
1. 使用全局静态变量记录住第一个被实例化的对象
static Ticket *SharedInstance
2. 重写allocWithZone方法,并使用dispatch_once_t,从而保证在多线程情况下,
同样只能实例化一个对象副本
3. 建立一个以shared开头的类方法实例化单例对象,便于其他类调用,同时不容易引起歧义
同样用dispatch_once_t确保只有一个副本被建立
关于被抢夺资源使用的注意事项
在多线程应用中,所有被抢夺资源的属性需要设置为原子属性
系统会在多线程抢夺时,保证该属性有且仅有一个线程能够访问
注意:使用atomic属性,会降低系统性能,在开发多线程应用时,尽量不要资源
另外,atomic属性,必须与@synchronized(同步锁)一起使用
*/
// 使用内存地址实例化对象,所有实例化方法,最终都会调用此方法
// 要实例化出来唯一的对象,需要一个变量记录住第一个实例化出来的对象
+ (id)allocWithZone:(NSZone *)zone
{
// 解决多线程中,同样只能实例化出一个对象副本
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [super
allocWithZone:zone];
});
return
SharedInstance;
}
// 建立一个单例对象,便于其他类调用
+ (Ticket *)sharedTicket
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [[Ticket
alloc]init];
});
return
SharedInstance;
}
@end
相关文章推荐
- php设计模式之单例模式实例分析
- JavaScript编程的单例设计模讲解
- C#设计模式之单例模式实例讲解
- JS模式之单例模式基本用法
- 深入理解JavaScript系列(25):设计模式之单例模式详解
- Java单例模式、饥饿模式代码实例
- Android源码学习之单例模式应用及优点介绍
- C++设计模式之单例模式
- C#窗口实现单例模式的方法
- Java线程安全中的单例模式
- PHP单例模式详细介绍
- PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
- php实现singleton()单例模式实例
- PHP中数据库单例模式的实现代码分享
- php利用单例模式实现日志处理类库
- 浅析php单例模式
- php单例模式实现方法分析
- javascript单例模式的简单实现方法
- js单例模式的两种方案
- php单例模式示例分享