亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

objective-c 單例繼承問題

objective-c 單例繼承問題

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

2 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

先說你錯在哪:
雖然方法中self是不同的類,但是kInstance只有一個。
你只用[BaseDAOsharedInstance];一直都不會出問題
一旦[XXXsharedInstance];kInstance已存在,不會再重新生成,返回的就是BaseDAO的單例。你對著BaseDAO的對象發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);
}如果你覺得用了上述方法,所有類都能產生單例太臟,可以新建個Protocol,單在Protocol中聲明sharedInstace。需要單例的類自己多重繼承一下好用的話把答案勾給我
                            
查看完整回答
反對 回復 2019-04-23
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號