先说你错在哪:
虽然方法中self是不同的类,但是kInstance只有一个。
你只用[BaseDAO sharedInstance];一直都不会出问题
一旦[XXX sharedInstance]; kInstance已存在,不会再重新生成,返回的就是BaseDAO的单例。你对着BaseDAO的对象发XXX的消息当然会unrec sel。
总之,kInstace存的一直都是第一次调用sharedInstance时,接收消息的类的单例
你耳朵里有没有偶尔回旋起这样一句话:
多用组合,少用继承
你如果觉得用组合有绕路的感觉,我来炫下技:
NSObject+OTSharedInstance.h:
@interface NSObject (OTSharedInstance)
+ (id)sharedInstance;
@end
NSObject+OTSharedInstance.m:
#import <objc/runtime.h>
@implementation NSObject (OTSharedInstance)
+ (id)sharedInstance
{
Class selfClass = [self class];
id instance = objc_getAssociatedObject(selfClass, @"kOTSharedInstance");
if (!instance)
{
instance = [[selfClass alloc] init];
objc_setAssociatedObject(selfClass, @"kOTSharedInstance", instance, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return instance;
}
@end内存不够用的话可能需要释放单例,补个释放的方法:
+ (void)freeSharedInstance
{
Class selfClass = [self class];
objc_setAssociatedObject(selfClass, SHARED_INSTANCE_KEY, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}测试代码:
#import "NSObject+OTSharedInstance.h"
id a;
id b;
for (int i = 0; i<10; i++)
{
a = [UIWindow sharedInstance];
NSLog(@"instance a : %@",a);
b = [UIView sharedInstance];
NSLog(@"instance b : %@",b);
}如果你觉得用了上述方法,所有类都能产生单例太脏,可以新建个Protocol,单在Protocol中声明sharedInstace。需要单例的类自己多重继承一下
好用的话把答案勾给我