【问题标题】:How to dealloc a singleton?如何释放单例?
【发布时间】:2013-08-09 06:58:03
【问题描述】:

我有一个名为“Capture”的类,它是 NSObject 的子类,它还向父视图添加视图。

我添加了一个由滑块组成的 Settings.bundle。当滑块值为“ON/1”时,我将主窗口中“捕获”中的视图显示为子视图。当滑块值为“OFF/0”时,我必须删除从“Capture”中添加的视图并释放“Capture”中存在的所有对象。

当滑块值为“OFF/0”时,我只是不想将“Capture”类创建的视图隐藏到主视图中。

我想在应用程序发送到后台而不是在应用程序终止时释放“捕获”,所以我不能使用通知 UIApplicationWillTerminateNotification 来释放单例。

如果我只是隐藏'Capture'显示的视图,'Capture'类将不必要地使用内存

那么现在我该如何释放一个单例。

'Capture' 类视图将位于每个视图控制器之上,即使事件发生时也是如此。 由AppDelegate中调用的类方法分配一次。

单例是这样创建的:

static ScreenCapture *sharedScreen = nil;

+(Capture *)sharedScreenCapture
{
    if (!sharedScreen) 
    {
        sharedScreen = [[Capture alloc] init];
    }
    return sharedScreen;
}

【问题讨论】:

  • 显示如何创建单例的代码。
  • 让一切都成为单身的诅咒 ;-)
  • 静态截屏 *sharedScreen = nil; +(Capture *)sharedCapture { if (!sharedScreen) { sharedScreen = [[Capture alloc] init]; } 返回共享屏幕;该方法在 appdelegate 中调用。
  • 真的有必要释放单例吗?我不这么认为。因为如果你在某个地方释放它,它就会失去它的价值,这不是singleton 的行为。
  • 结束应用程序。如果您不希望该对象在应用程序的整个生命周期中持续存在,则不应将其设为单例。

标签: iphone ios singleton dealloc


【解决方案1】:

为什么不创建一些ReLoad 方法来清除您的所有现金并取消您的私有变量?

类似这样的:

+(void) reLoad {
    @synchronized(self) {
        // clear all the cashes...
        sharedScreen = nil;
    }
}

并在收到UIApplicationWillTerminateNotification后调用它

[ScreenCapture reLoad];

【讨论】:

  • 但是当用户在后台发送此应用并更改此应用的滑块值并返回应用时,更改应该是可见的。例如,如果用户将滑块值更改为“否”,则“捕获”显示的视图不应该是可见的。由于它不可见,我只想解除分配“捕获”。
【解决方案2】:

您可以添加其他方法:

+ (void)destroyScreenCapture
{
    sharedScreen = nil;
}

考虑单例是否真的适合您使用,如果您真的需要销毁单例,或者您是否应该“清理”它以释放它当前未使用的数据的所有内存。

【讨论】:

  • 谢谢..我认为单例不应该被释放,如果被释放,它不应该直接完成..
  • 一个单例不应该被释放,如果你需要它建议它不应该是一个单例。
猜你喜欢
  • 1970-01-01
  • 2012-02-17
  • 2012-06-13
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多