objective-c 单例继承问题

今天在修改数据库,发现每个类都有自己的单例实现函数,然后很多冗余的逻辑,于是就想父类写一个单例函数,然后子类继承就可以生成各自的单例了.
结果发现俺错了...
+(id)sharedInstance{
staticBaseDAO*kInstance=nil;
NSLog(@"kInstance=%@",kInstance);
@synchronized(self){
if(kInstance==nil){
kInstance=[[selfalloc]init];
}else{
}
}
returnkInstance;
}
结果是所有的子类得到的都是同一个单例,然后就unrecognizedselectorsenttoinstance
我看了下java是有这种功能的,因为可以把属性设置为static,oc刚试了不行.
不知道有木有方法实现各子类不同单例.
千万里不及你
浏览 357回答 2
2回答

慕无忌1623718

先说你错在哪:虽然方法中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

汪汪一只猫

歪一下。现在我的单例这么写+(class*)accessor{staticdispatch_once_tonce;staticclass*singleton;dispatch_once(&once,^{singleton=[[classalloc]init];});returnsingleton;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript