专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
51好读  ›  专栏  ›  Cocoa开发者社区

iOS开发 单例使用问题

Cocoa开发者社区  · 公众号  · ios  · 2017-06-03 11:00

正文

请到「今天看啥」查看全文



当类只能有一个实例,而且必须从一个访问点对其进行访问时使用单例就显得十分方便,因为使用单例保证了访问点的唯一、一致且为人熟知。


单例中的问题


全局状态


首先我们都应该达成一个共识“全局可变状态”是危险的,因为这样会让程序变得难以理解和调试,就削减状态性代码上,面向对象编程应该向函数式编程学习。


比如下面的代码:


@implementation Math{

NSUInteger _a;

NSUInteger _b;

}


-(NSUInteger)computeSum

{

return _a + _b;

}


这段代码想要计算_a和_B相加的和,并返回。但事实上这段代码存在着不少问题:


  • computeSum方法中并没有把_a和_b作为参数。相比查找interface并了解哪个变量控制方法的输出,查找implementation来了解显得更隐蔽,而隐蔽代表着容易发生错误。

  • 当准备修改_a和_b的值来让它们调用computeSum方法的时候,程序员必须清楚修改它们的值不会影响其他包含着两个值的代码的正确性,而在多线程的情况下作出这样的判断显得尤其困难。


对比下面这段代码:


+(NSUInteger)computeSumOf:(NSUInteger)a plus:(NSUInteger)b

{

return a + b;

}


这段代码中,a和b的从属显得十分清晰,不再需要去改变实例的状态来调用这个方法,而且不用担心调用这个方法的副作用。


那这个例子和单例又有什么关系呢?事实上,单例就是披着羊皮的全局状态。一个单例可以在任何地方被使用,而且不用清晰地声明从属。程序中的任何模块都可以简单的调用[MySingleton sharedInstance],然后拿到这个单例的访问点,这意味着任何和单例交互时产生的副作用都会有可能影响程序中随机的一段代码,如:







请到「今天看啥」查看全文