我正在创建单例实例,如下所示:
+(MySingleton*)sharedInstance {
static MySingleton sharedObject = nil;
static dispatch_once_t predicate = 0;
dispatch_once(&predicate, ^{
sharedObject = [[MySingleton alloc] init];
});
return sharedObject;
}
sharedObject
自动解除分配的可能性有哪些?
在应用程序终止之前,如何确保sharedObject
将保留在内存中?
答案 0 :(得分:12)
正如另一个答案正确指出的那样,这个共享的单身人士永远不会被解除分配。有两个部分要回答"为什么",两者都来自以下几行:
static MySingleton * sharedObject = nil;
首先,static
。 static
,在此类函数中使用时,修改变量的生存期,将其从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
很可能在运行一次之后释放运行块。这意味着,它会在被叫之后释放。