1

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

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

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

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

或者,也许还有另一种方法可以完成我想要的,而不必诉诸当前可能不太成问题的技术

人们可以对这个问题提出什么建议?

4

2 回答 2

2

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

于 2012-04-29T01:28:36.183 回答
1

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

+ (id)sharedInstance
{
    static dispatch_once_t once;
    static SingletonClass *sharedInstance;
    dispatch_once(&once, ^ { sharedInstance = [[self alloc] init]; });
    return sharedInstance;
}
于 2012-04-29T01:32:56.417 回答