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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

objective-c 單例繼承問題

objective-c 單例繼承問題

千萬里不及你 2019-04-06 08:31:27
今天在修改數(shù)據(jù)庫,發(fā)現(xiàn)每個類都有自己的單例實現(xiàn)函數(shù),然后很多冗余的邏輯,于是就想父類寫一個單例函數(shù),然后子類繼承就可以生成各自的單例了.結果發(fā)現(xiàn)俺錯了...+(id)sharedInstance{staticBaseDAO*kInstance=nil;NSLog(@"kInstance=%@",kInstance);@synchronized(self){if(kInstance==nil){kInstance=[[selfalloc]init];}else{}}returnkInstance;}結果是所有的子類得到的都是同一個單例,然后就unrecognizedselectorsenttoinstance我看了下java是有這種功能的,因為可以把屬性設置為static,oc剛試了不行.不知道有木有方法實現(xiàn)各子類不同單例.
查看完整描述

2 回答

?
慕無忌1623718

TA貢獻1744條經(jīng)驗 獲得超4個贊

先說你錯在哪:
雖然方法中self是不同的類,但是kInstance只有一個。
你只用[BaseDAOsharedInstance];一直都不會出問題
一旦[XXXsharedInstance];kInstance已存在,不會再重新生成,返回的就是BaseDAO的單例。你對著BaseDAO的對象發(fā)XXX的消息當然會unrecsel。
總之,kInstace存的一直都是第一次調用sharedInstance時,接收消息的類的單例你耳朵里有沒有偶爾回旋起這樣一句話:多用組合,少用繼承你如果覺得用組合有繞路的感覺,我來炫下技: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內存不夠用的話可能需要釋放單例,補個釋放的方法:+(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)生單例太臟,可以新建個Protocol,單在Protocol中聲明sharedInstace。需要單例的類自己多重繼承一下好用的話把答案勾給我
                            
查看完整回答
反對 回復 2019-04-06
?
汪汪一只貓

TA貢獻1898條經(jīng)驗 獲得超8個贊

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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