1 前言
使用 dispatch_once 函数 在 APP 的生命周期内来保证你想确保每段代码只执行一次,即使它在代码的不同地方多次调用(比如单例的初始化)。
2 代码实例
ZYAppDelegate.m
//一个用于调度一次函数的标识 static dispatch_once_t onceToken; //Block Object void (^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 结语
以上是所有内容,希望对大家有所帮助