oc中单例
?
單例在程序設(shè)計(jì)中很常用,objective c中單例的寫法與java等其他語言有些差別
官方建議?
由于自己設(shè)計(jì)單態(tài)模式存在一定風(fēng)險(xiǎn),主要是考慮到可能在多線程情況下會(huì)出現(xiàn)的問題,因此蘋果官方建議使用以下方式來實(shí)現(xiàn)單態(tài)模式:
static MyGizmoClass * sharedGizmoManager = nil;?
+ (MyGizmoClass*)sharedManager?
{?
??? @synchronized(self) {?
??????? if (sharedGizmoManager == nil) {?
??????????? [[self alloc] init]; // assignment not done here?
??????? }?
??? }?
??? return sharedGizmoManager;?
}?
//為了確保有且只有一個(gè)實(shí)例,有必要覆蓋一下+ (id)allocWithZone:(NSZone *)zone 這個(gè)方法,如果不小心調(diào)用了alloc方法,則又會(huì)創(chuàng)建一個(gè)實(shí)例
+ (id)allocWithZone:(NSZone *)zone?
{?
??? @synchronized(self) {?
??????? if (sharedGizmoManager == nil) {?
??????????? sharedGizmoManager = [super allocWithZone:zone];?
??????????? return sharedGizmoManager;? // assignment and return on first allocation?
??????? }?
??? }?
??? return nil; //on subsequent allocation attempts return nil?
}?
覆蓋下面幾個(gè)方法同樣也是確保在程序生命周期中有且只有一個(gè)實(shí)例,
- (id)copyWithZone:(NSZone *)zone?
{?
??? return self;?
}?
- (id)retain?
{?
??? return self;?
}?
- (unsigned)retainCount?
{?
??? return UINT_MAX;? //denotes an object that cannot be released?
}?
- (void)release?
{?
??? //do nothing?
}?
- (id)autorelease?
{?
??? return self;?
}
轉(zhuǎn)載于:https://www.cnblogs.com/X-Code/archive/2013/02/14/2911262.html
總結(jié)
- 上一篇: 实现远程关机
- 下一篇: mysql存储过程--往表中批量插入数据