ios什么是單例
時間:
歐東艷656由 分享
ios什么是單例
單例模式是ios里面經常使用的模式,例如
[UIApplicationsharedApplication] (獲取當前應用程序對象)、[UIDevicecurrentDevice](獲取當前設備對象);
單例模式的寫法也很多。
第一種:
- static Singleton *singleton = nil;
- // 非線程安全,也是最簡單的實現
- + (Singleton *)sharedInstance
- {
- if (!singleton) {
- // 這里調用alloc方法會進入下面的allocWithZone方法
- singleton = [[self alloc] init];
- }
- return singleton;
- }
- // 這里重寫allocWithZone主要防止[[Singleton alloc] init]這種方式調用多次會返回多個對象
- + (id)allocWithZone:(NSZone *)zone
- {
- if (!singleton) {
- NSLog(@"進入allocWithZone方法了...");
- singleton = [super allocWithZone:zone];
- return singleton;
- }
- return nil;
- }
第二種:
- // 加入線程安全,防止多線程情況下創(chuàng)建多個實例
- + (Singleton *)sharedInstance
- {
- @synchronized(self)
- {
- if (!singleton) {
- // 這里調用alloc方法會進入下面的allocWithZone方法
- singleton = [[self alloc] init];
- }
- }
- return singleton;
- }
- // 這里重寫allocWithZone主要防止[[Singleton alloc] init]這種方式調用多次會返回多個對象
- + (id)allocWithZone:(NSZone *)zone
- {
- // 加入線程安全,防止多個線程創(chuàng)建多個實例
- @synchronized(self)
- {
- if (!singleton) {
- NSLog(@"進入allocWithZone方法了...");
- singleton = [super allocWithZone:zone];
- return singleton;
- }
- }
- return nil;
- }
第三種:
- __strong static Singleton *singleton = nil;
- // 這里使用的是ARC下的單例模式
- + (Singleton *)sharedInstance
- {
- // dispatch_once不僅意味著代碼僅會被運行一次,而且還是線程安全的
- static dispatch_once_t pred = 0;
- dispatch_once(&pred, ^{
- singleton = [[super allocWithZone:NULL] init];
- });
- return singleton;
- }
- // 這里
- + (id)allocWithZone:(NSZone *)zone
- {
- /* 這段代碼無法使用, 那么我們如何解決alloc方式呢?
- dispatch_once(&pred, ^{
- singleton = [super allocWithZone:zone];
- return singleton;
- });
- */
- return [self sharedInstance];
- }
- - (id)copyWithZone:(NSZone *)zone
- {
- return self;
- }