標籤:share 解釋 連結 static 參考 super har 宏定義 ini
#undef AS_SINGLETON
#define AS_SINGLETON( __class ) \
- (__class *)sharedInstance; \
+ (__class *)sharedInstance;
#undef DEF_SINGLETON
#define DEF_SINGLETON( __class ) \
- (__class *)sharedInstance \
{ \
return [__class sharedInstance]; \
} \
+ (__class *)sharedInstance \
{ \
static dispatch_once_t once; \
static __class * __singleton__; \
dispatch_once( &once, ^{ __singleton__ = [[[self class] alloc] init]; } ); \
return __singleton__; \
} \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
static dispatch_once_t once; \
static __class * __singleton__; \
dispatch_once(&once, ^{ __singleton__ = [super allocWithZone:zone]; } ); \
return __singleton__; \
}
使用方法:在.h中聲明AS_SINGLETON(__class)
.m中聲明DEF_SINGLETON(__class)
解釋:為了防止別人不小心利用alloc/init方式建立樣本,也為了防止別人故意為之,我們要保證不管用什麼方式建立都只能是同一個執行個體對象,這就得重寫allocWithZone;之前我是沒有這個的,這是alloc init 和shareinstance建立的不是同一個
參考連結:http://www.cocoachina.com/ios/20160713/17017.html?ref=myread這個寫的很詳細
ios oc單例宏定義