![]() |
1
3
这是我第一篇关于堆栈溢出的文章。。。(为愚蠢做准备) 我认为有一个混合的解决方案可能是有用的。 我想在不调用“getSharedInstance”的情况下设置并从单例类中获取(全局)值。我希望代码看起来像这样。。。
为了实现这一点,我们需要存储在singleton中的每个变量都有一个getter和setter类方法。然后,类方法转到一个实例,将数据存储在ivar中。主程序无法直接访问该实例。 getter看起来是这样的:
(丑陋的)实例调用隐藏在类代码中。 通过在这里调用实例方法,类方法将在首次使用时自动实例化对象。一旦实例化了singleton,实例就按惯例存储ivar。在这里,我用“IVAR”前缀使IVAR显式。
和
这会自动创建传统的getter(和setter)方法来访问ivar。 (编辑-下面是一个完整的示例)
和
|
![]() |
2
5
对于iOS 4.0或更高版本,目前最好的解决方案是使用
您可能还需要考虑使用单个分派队列来序列化对类内部的访问。如果所有的公共方法只是在同一个调度队列上运行一个块,那么就不必担心并发问题。 |
![]() |
3
0
这很好,但仍然只是改变你的环境,而不是解决你的问题。除非你没有任何实际的数据绑定到你的单例,在这种情况下,这将工作得很好。无论何时访问中心数据,都需要使其具有线程安全性。 另外,如果没有某种iVar,我不知道如何直接在类中存储数据。 在上面的示例中,我将以这种方式进行编码,得到与您建议的结果相同的结果,并且只有在创建/重新创建单例时才能获得性能上的影响:
请记住,无论哪种方式,如果您访问的数据可能在不同的线程上发生更改,那么无论如何,您都必须使该代码线程安全,要么进行非常仔细的规划,要么使用代码确保没有问题。我推荐一种混合,但如果有疑问的话,最好是后者。=) |
![]() |
4
0
如果使用类作为单例,存储数据的唯一方法是使用静态文件变量和全局变量。如果你打算做一个你不打算实例化的类,你也可以使用标准的C函数:
|
![]() |
S qasem · Android内存性能 6 年前 |
![]() |
R83nLK82 · 在单例设计模式上引发IOException 6 年前 |
![]() |
hal · 两个课程有什么区别?他们的工作方式不同吗? 6 年前 |
![]() |
Jaquarh · 如何在不使用DI的情况下实例化父类 7 年前 |
|
Deepanshu · 基于PHP的Web应用程序中的单例对象状态 7 年前 |
![]() |
dicle · 视图控制器中的依赖项注入 7 年前 |
![]() |
Kozuki · 如何在生产代码中考虑单例? 7 年前 |