dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
}); // when 时间 从现在开始经过多少纳秒
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
void (^task)() = ^ {
// 延迟操作执行的代码
NSLog(@"%@", [NSThread currentThread]);
};
// 经过多少纳秒,由主队列调度任务异步执行
dispatch_after(when, dispatch_get_main_queue(), task);
// 先执行就是异步,后执行就是同步
NSLog(@"come here");static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
})
#if __has_feature(objc_arc) // ARC #else // MRC #endif
@implementation SoundTools
// 定义一个静态成员,保存唯一的实例
static id instance;
// 保证对象只被分配一次内存空间,通过dispatch_once能够保证单例的分配和初始化是线程安全的
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}
// 保证对象只被初始化一次
+ (instancetype)sharedSoundTools {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
- (id)copyWithZone:(NSZone *)zone {
return instance;
}
@end
测试代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
SoundTools *s1 = [SoundTools sharedSoundTools];
NSLog(@"%p", s1);
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
SoundTools *s2 = [SoundTools sharedSoundTools];
NSLog(@"%p", s2);
}// 定义一个静态成员,保存唯一的实例
static id instance;
// 保证对象只被分配一次内存空间,通过dispatch_once能够保证单例的分配和初始化是线程安全的
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}
// 保证对象只被初始化一次
+ (instancetype)sharedSoundTools {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
- (id)copyWithZone:(NSZone *)zone {
return instance;
}
#pragma mark - MRC内存管理方法
/**
因为单例的对象是保存在静态区的,因此需要重写 内存管理方法,取消默认的引用计数操作!
*/
// 默认会将引用计数-1
- (oneway void)release {
// 什么也不做,跟highlight类似
}
// 默认引用计数+1,同时返回一个对象
- (instancetype)retain {
return instance;
}
// 默认添加自动释放标记,延迟释放!
- (instancetype)autorelease {
return instance;
}
// 返回有多少个对象对当前对象引用的数值
- (NSUInteger)retainCount {
// 出处:limits.h 会根据CPU的架构自行调整整数的长度
return ULONG_MAX;
}
原文地址:http://blog.csdn.net/u011058732/article/details/44523015