1 前言
使用 dispatch_once 函數 在 APP 的生命週期內來保證你想確保每段代碼只執行一次,即使它在代碼的不同地方多次調用(比如單例的初始化)。
2 代碼執行個體
ZYAppDelegate.m
//一個用於調度一次函數的標識static dispatch_once_t onceToken;//Block Objectvoid (^executedOnlyOnce)(void) = ^{ static NSUInteger numberOfEntries = 0; numberOfEntries++; NSLog(@"Executed %lu time(s)", (unsigned long)numberOfEntries);};- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ //聲明一個隊列 dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //執行一次的隊列 dispatch_once(&onceToken, ^{ dispatch_async(concurrentQueue, executedOnlyOnce); }); dispatch_once(&onceToken, ^{ dispatch_async(concurrentQueue, executedOnlyOnce); }); self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.viewController = [[[ZYViewController alloc] initWithNibName:@"ZYViewController" bundle:nil] autorelease]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; return YES;}
ZYViewController.m
- (void)viewDidLoad{ [super viewDidLoad]; ZYMySingleton *test = [[ZYMySingleton alloc] init]; //迴圈單例方法 for (int i=0; i<5; i++) { [test sharedInstance]; } [test release];}
ZYMySingleton.m
- (id) sharedInstance{ static ZYMySingleton *SharedInstance = nil; //一個用於調度一次函數的標識 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ SharedInstance = [ZYMySingleton new]; NSLog(@"SharedInstance is ======>%@",SharedInstance); }); return SharedInstance;}
運行後控制台顯示結果
2013-05-10 17:30:49.334 GCDSingleTest[2717:1303] Executed 1 time(s)
2013-05-10 17:30:49.336 GCDSingleTest[2717:c07] SharedInstance is ======><ZYMySingleton: 0x7195990>
3 結語
以上是所有內容,希望對大家有所協助
Demo代碼下載:http://download.csdn.net/detail/u010013695/5353668