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; }