使用[NSObject load]初始化系统,没有自动释放池

时间:2012-04-29 00:54:42

标签: ios autorelease

我正在使用Xcode 4.3.2和iOS模拟器编写iPad应用程序。我有一系列类,我想在启动时注册一个单例,以便其他类可以通过这些注册类提供的单例来请求服务。

为了实现这种行为,我一直依赖于覆盖NSObject上的 load 类方法。但是,我发现在有机会设置自动释放池之前,所有由 load 方法执行的代码都发生在main函数之外。我在我的应用程序中使用了一些第三方技术,当前禁止使用或自动引用计数,所以我需要依靠自动释放池来帮助管理创建对象的生命周期。

在注册过程中,调试控制台中出现了许多消息,模拟器抱怨没有自动释放池调用autorelease。其中一个与单身人士分配的字典有关。其他与块对象相关,这些块对象从堆栈中复制并存储在该单例字典中。

我不清楚这些调试消息有多严重。我怀疑字典的分配可能没有问题,因为单例应该在应用程序的生命周期中存在,并且该字典可能永远不会被释放。同样,存储在字典中的块也应该保持不变,所以我想知道在调用 copy 方法之后我是否不需要打扰对它们进行自动释放。

或许还有另一种方法可以实现我想要的东西,而不得不采用可能不那么成问题的现有技术

人们可以就此问题提出什么建议?

2 个答案:

答案 0 :(得分:2)

你应该有更好的运气覆盖+[NSObject initialize]而不是loadinitialize在第一次引用类时调用,而不是在加载类所在的图像时调用。这将使您更好地处理所有这些。

答案 1 :(得分:1)

一个好方法是在所有线程中使用dispatch_once_t,每个运行时只执行一次:

+ (id)sharedInstance
{
    static dispatch_once_t once;
    static SingletonClass *sharedInstance;
    dispatch_once(&once, ^ { sharedInstance = [[self alloc] init]; });
    return sharedInstance;
}