Singleton实例自动解除分配的可能性

时间:2014-12-06 08:53:55

标签: ios objective-c singleton

我正在创建单例实例,如下所示:

+(MySingleton*)sharedInstance  {    
      static MySingleton sharedObject = nil;

      static dispatch_once_t predicate = 0;

    dispatch_once(&predicate, ^{
         sharedObject = [[MySingleton alloc] init];
    });
    return sharedObject;  
}

sharedObject自动解除分配的可能性有哪些?

在应用程序终止之前,如何确保sharedObject将保留在内存中?

4 个答案:

答案 0 :(得分:12)

正如另一个答案正确指出的那样,这个共享的单身人士永远不会被解除分配。有两个部分要回答"为什么",两者都来自以下几行:

static MySingleton * sharedObject = nil;

首先,staticstatic,在此类函数中使用时,修改变量的生存期,将其从automatic(隐式默认值)更改为static。这意味着该变量存在于程序的整个生命周期中。

其次,此声明使sharedObject成为引用。 Objective-C中的变量默认是强大的,但要迂腐,你可以写:

static __strong MySingleton * sharedObject = nil;

所以:我们有一个变量,它存在于程序的整个持续时间内(static),并且保持对它所代表的对象(__strong)的强引用。有了这两条信息,再加上你永远不会改变变量指向的对象这一事实,你可以推断sharedObject永远不会被释放。

答案 1 :(得分:3)

0可能性。它永远不会被释放,static保留强有力的参考。在ARC世界中,你不能只是在没有先保留它的情况下发布它。

答案 2 :(得分:1)

我遇到了一个非常可疑的案例,它可能会被释放并导致不愉快的问题,所以虽然不常见但要注意。

如果您将其内存地址传递给第三方低级库,即。 as user_data(或者您创建的低级c库),该库释放内存。您不希望外部库释放您提供的user_data,但我正在使用的Web套接字c库就是这种情况。

答案 3 :(得分:-6)

sharedObject将在其包含的函数完成后以及释放包含的块后释放。因此,dispatch_once很可能在运行一次之后释放运行块。这意味着,它会在被叫之后释放。