为了账号安全,请及时绑定邮箱和手机立即绑定

objective-c 单例继承问题

objective-c 单例继承问题

qq_遁去的一_1 2019-04-06 08:31:25
今天在修改数据库,发现每个类都有自己的单例实现函数,然后很多冗余的逻辑,于是就想父类写一个单例函数,然后子类继承就可以生成各自的单例了.结果发现俺错了...+(id)sharedInstance{staticBaseDAO*kInstance=nil;NSLog(@"kInstance=%@",kInstance);@synchronized(self){if(kInstance==nil){kInstance=[[selfalloc]init];}else{}}returnkInstance;}结果是所有的子类得到的都是同一个单例,然后就unrecognizedselectorsenttoinstance我看了下java是有这种功能的,因为可以把属性设置为static,oc刚试了不行.不知道有木有方法实现各子类不同单例.
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

先说你错在哪:
虽然方法中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-06
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

歪一下。现在我的单例这么写+(class*)accessor
{
staticdispatch_once_tonce;
staticclass*singleton;
dispatch_once(&once,^{singleton=[[classalloc]init];});
returnsingleton;
}
                            
查看完整回答
反对 回复 2019-04-06
  • 2 回答
  • 0 关注
  • 383 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信