一个单例引发的思考
2018-01-11 本文已影响14人
杨柳小易
一个单例引发的思考
项目中有一个直播页面(UIViewController之类的东东),打开进去之后有30+ 个单例生成。这个量级有点大,以至于由来我见了程序员朋友都会问,单例多少个合适,什么情况下能用。这么多哔哔哔哔,现在有以下观点。
观点一
内存没问题就不用管啦啦……
观点二
能不用就不用,除非不用单例模式解决不了问题
有趣的观点
单例分为:绝对单例,非绝对单例,普及一下:
所谓绝对单例,不管怎么创建,只能有一个实例存在,比如 init new shareInstnce 他们创建出来的都是同一个。 非绝对单例,shareInstnce 方法创建出来的永远是一个,init new 等方法和平常一样
weak单例
这个更有意思,某些单例的存在可能只用一次,所以,单例模式也能弄成weak 的,不用的时候就释放了,比如:实现
+ (id)sharedInstance
{
static __weak ASingletonClass *instance;
ASingletonClass *strongInstance = instance;
@synchronized(self) {
if (strongInstance == nil) {
strongInstance = [[[self class] alloc] init];
instance = strongInstance;
}
}
return strongInstance;
}
if 没有人持有 ASingletonClass 的单例了,这个单例就不存在了……
类似单例的东东
比如写在appdelegate中的东东
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) PTVUserAccount * userAccount;
@property (strong, nonatomic) PTVNetworkStatus* networkStatus;
@property (strong, nonatomic) PTVPushNotification* pushNotification;
@property (strong, nonatomic) PTVTaskManager* taskManager;
////休眠管理
@property (strong, nonatomic) DormancyManager* dormancyManager;
///后台播放管理
@property(nonatomic, strong) BackgroundPlayControl *backgroundPlayControl;
这里的东东,和 appdelegate 其实没有任何关系。为什么要放在这里呢?
END??有其他看法请留言告知我,跪谢
如果引入单例是为了解耦。这个解耦代价太大了。比如,名片卡,这个单例,点击了名片卡,然后关闭,这个对象就应该彻底的消失。而不是等待。
再比如:
-(void)analysisGuessCompetitionList:(id)data
{
GuessCompetitionGeneralList *list = [GuessCompetitionGeneralList yy_modelWithDictionary:data];
if(list) {
_isOpen = list.bswitch;
if(list.guesscompArray.count > 0) {
[[PTVMultiFunctionManager sharedInstance] addMultiFunctionWithType:PTVMultiFunctionGuess isShow:self.isShowCurrentAction];
} else {
[[PTVMultiFunctionManager sharedInstance] removeMultiFunctionWithType:PTVMultiFunctionGuess];
}
}
}
网络请求成功之后,突然冒出一个单例来设置状态。这种跨模块的直接设置,其实没有解耦吧?