OC基礎(27)

單例設計模式

本小節知識點:

  1. 【理解】單例模式概念
  2. 【理解】簡單的單例模式實現

1.單例模式概念

  • 什麼是單例模式:(Singleton)web

    • 單例模式的意圖是是的類的對象成爲系統中惟一的實例,􏰀供一個訪問點,供客戶類 共享資源。
  • 什麼狀況下使用單例?設計模式

    • 一、類只能有一個實例,並且必須從一個爲人熟知的訪問點對其進行訪問,好比工廠方 法。
    • 二、這個惟一的實例只能經過子類化進行擴展,並且擴展的對象不會破壞客戶端代碼。
  • 單例設計模式的要點:ide

    • 1) 某個類只能有一個實例。
    • 2)他必須自行建立這個對象
    • 3)必須自行向整個系統􏰀供這個實例;
    • 4)爲了保證明例的惟一性,咱們必須將
    • 5)這個方法必須是一個靜態類

2.簡單的單例模式實現

#define interfaceSingleton(name)  +(instancetype)share##name


#if __has_feature(objc_arc)
// ARC
#define implementationSingleton(name)  \
+ (instancetype)share##name \
{ \
name *instance = [[self alloc] init]; \
return instance; \
} \
static name *_instance = nil; \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[super allocWithZone:zone] init]; \
}); \
return _instance; \
} \
- (id)copyWithZone:(NSZone *)zone{ \
return _instance; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return _instance; \
}
#else
// MRC

#define implementationSingleton(name)  \
+ (instancetype)share##name \
{ \
name *instance = [[self alloc] init]; \
return instance; \
} \
static name *_instance = nil; \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[super allocWithZone:zone] init]; \
}); \
return _instance; \
} \
- (id)copyWithZone:(NSZone *)zone{ \
return _instance; \
} \
- (id)mutableCopyWithZone:(NSZone *)zone \
{ \
return _instance; \
} \
- (oneway void)release \
{ \
} \
- (instancetype)retain \
{ \
return _instance; \
} \
- (NSUInteger)retainCount \
{ \
return  MAXFLOAT; \
}
#endif
相關文章
相關標籤/搜索