第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

objective-c 單例繼承問題

objective-c 單例繼承問題

冉冉說 2019-04-23 15:18:05
今天在修改數(shù)據(jù)庫,發(fā)現(xiàn)每個(gè)類都有自己的單例實(shí)現(xiàn)函數(shù),然后很多冗余的邏輯,于是就想父類寫一個(gè)單例函數(shù),然后子類繼承就可以生成各自的單例了.結(jié)果發(fā)現(xiàn)俺錯(cuò)了...+(id)sharedInstance{staticBaseDAO*kInstance=nil;NSLog(@"kInstance=%@",kInstance);@synchronized(self){if(kInstance==nil){kInstance=[[selfalloc]init];}else{}}returnkInstance;}結(jié)果是所有的子類得到的都是同一個(gè)單例,然后就unrecognizedselectorsenttoinstance我看了下java是有這種功能的,因?yàn)榭梢园褜傩栽O(shè)置為static,oc剛試了不行.不知道有木有方法實(shí)現(xiàn)各子類不同單例.
查看完整描述

2 回答

?
縹緲止盈

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊

先說你錯(cuò)在哪:
雖然方法中self是不同的類,但是kInstance只有一個(gè)。
你只用[BaseDAOsharedInstance];一直都不會(huì)出問題
一旦[XXXsharedInstance];kInstance已存在,不會(huì)再重新生成,返回的就是BaseDAO的單例。你對著BaseDAO的對象發(fā)XXX的消息當(dāng)然會(huì)unrecsel。
總之,kInstace存的一直都是第一次調(diào)用sharedInstance時(shí),接收消息的類的單例你耳朵里有沒有偶爾回旋起這樣一句話:多用組合,少用繼承你如果覺得用組合有繞路的感覺,我來炫下技:NSObject+OTSharedInstance.h:@interfaceNSObject(OTSharedInstance)
+(id)sharedInstance;
@endNSObject+OTSharedInstance.m:#import
@implementationNSObject(OTSharedInstance)
+(id)sharedInstance
{
ClassselfClass=[selfclass];
idinstance=objc_getAssociatedObject(selfClass,@"kOTSharedInstance");
if(!instance)
{
instance=[[selfClassalloc]init];
objc_setAssociatedObject(selfClass,@"kOTSharedInstance",instance,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
returninstance;
}
@end內(nèi)存不夠用的話可能需要釋放單例,補(bǔ)個(gè)釋放的方法:+(void)freeSharedInstance
{
ClassselfClass=[selfclass];
objc_setAssociatedObject(selfClass,SHARED_INSTANCE_KEY,nil,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}測試代碼:#import"NSObject+OTSharedInstance.h"
ida;
idb;
for(inti=0;i<10;i++)
{
a=[UIWindowsharedInstance];
NSLog(@"instancea:%@",a);
b=[UIViewsharedInstance];
NSLog(@"instanceb:%@",b);
}如果你覺得用了上述方法,所有類都能產(chǎn)生單例太臟,可以新建個(gè)Protocol,單在Protocol中聲明sharedInstace。需要單例的類自己多重繼承一下好用的話把答案勾給我
                            
查看完整回答
反對 回復(fù) 2019-04-23
?
茅侃侃

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個(gè)贊

歪一下?,F(xiàn)在我的單例這么寫+(class*)accessor
{
staticdispatch_once_tonce;
staticclass*singleton;
dispatch_once(&once,^{singleton=[[classalloc]init];});
returnsingleton;
}
                            
查看完整回答
反對 回復(fù) 2019-04-23
  • 2 回答
  • 0 關(guān)注
  • 481 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號