Mat*_*ice 7 singleton cocoa-touch design-patterns
我刚开始写单例,我必须使用一个用于当前的iOS项目.其中一个要求是它可以被杀死.我知道这违背了单身人士的设计,但是这应该/可以做到吗?
当然可以这样做,但是如果你正在寻找一个可以创建的对象,然后在不需要的时候释放......这听起来像一个普通的对象.:)
一般来说,单身人士控制自己的生命周期.你将在这里进行单方面的讨论,除非你更多地谈到这两个要求(一个,你使用单身,两个,它可以随意发布),以及为什么它们在你的情况下都有意义.
这可能是因为单例包装了一些本质上唯一的其他资源(如文件资源或网络连接).如果这是真的,那么通常单例是该资源的"管理者",并且您将通过单例的接口公开对该资源的控制.
或者可能是因为单例对象持有大量内存(某种缓冲区),并且您希望确保在必要时刷新.如果是这种情况,那么您可以更聪明地了解其创建和释放内存的每个方法,或者您可以让单例监听低内存系统通知并正确运行.
从本质上讲,我很难构建一个案例,它确实释放了单例对象本身.单个基本对象在内存中只占用少量字节,并且不会因为闲逛而伤害任何人.
我知道这违背了单身人士的设计
它也违背了Objective-C中通常的内存管理模式.通常,对象会保留另一个对象以防止它被破坏,并释放它以允许对象被销毁.但是,明确地破坏对象并不是其他对象可以做的事情.
考虑如果对象A获得单例类S的共享实例S1会发生什么.如果A保留S1,即使某个类方法释放S并将指向共享实例的全局变量设置为nil,S1也将继续存在.当类稍后创建一个新的共享实例S2时,将有两个S实例,即S1和S2.这违反了首先定义单例的属性.
你可能可以通过覆盖-retain
和调整来解决这个问题-release
,但这似乎很难解决一个本来不应该存在的问题.
一种可能的替代方法是重置共享对象,而不是试图销毁它.如果需要,可以将其所有属性设置为某个已知(可能无效)状态,然后使用类方法重新初始化共享对象.请注意所有这些对可能正在使用共享对象的任何对象的影响.
几乎我写过的每一个单身(除了完全以UI为中心的控制器)最终被重构为不是单身人士.每一个.单.一.
因此,我已经停止写单身.我编写的类在实例中维护状态,就像任何普通类一样,并且与其他实例隔离开来.如果它们通知很重,它们总是self
作为通知对象传递.他们有代表.他们保持内部状态.他们避免在真正的全球状态之外的全局变量.
并且,通常,我的应用程序中可能只有一个所述类的实例.这个实例就像一个单例,事实上,我甚至可以创建一种方便的方法来获取它,可能通过App的委托或类方法(sharedInstance
有时甚至可能被命名).
所述类包括拆卸代码,该代码通常分为两部分; 用于以后恢复当前状态的代码和用于释放实例关联资源的代码.
像单身人士一样方便.准备好在需要时进行多重实例化.
归档时间: |
|
查看次数: |
4995 次 |
最近记录: |