一个单例引发的思考

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];
        }
    }
}

网络请求成功之后,突然冒出一个单例来设置状态。这种跨模块的直接设置,其实没有解耦吧?

上一篇下一篇

猜你喜欢

热点阅读