1 前言
使用 dispatch_once 函數 在 APP 的生命周期內來保證你想確保每段代碼只執行一次,即使它在代碼的不同地方多次調用(比如單例的初始化)。
2 代碼實例
ZYAppDelegate.m
[plain]
/一個用於調度一次函數的標識
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;
}
//一個用於調度一次函數的標識
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
[plain]
- (void)viewDidLoad
{
[super viewDidLoad];
ZYMySingleton *test = [[ZYMySingleton alloc] init];
//循環單例方法
for (int i=0; i<5; i++) {
[test sharedInstance];
}
[test release];
}
- (void)viewDidLoad
{
[super viewDidLoad];
ZYMySingleton *test = [[ZYMySingleton alloc] init];
//循環單例方法
for (int i=0; i<5; i++) {
[test sharedInstance];
}
[test release];
}
ZYMySingleton.m
[plain] view plaincopyprint?- (id) sharedInstance{
static ZYMySingleton *SharedInstance = nil;
//一個用於調度一次函數的標識
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SharedInstance = [ZYMySingleton new];
NSLog(@"SharedInstance is ======>%@",SharedInstance);
});
return SharedInstance;
}
- (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>