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
ARC環境下簡單地單例模式:
@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;
}