Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用[NSObject load]初始化没有自动释放池的系统_Ios_Autorelease - Fatal编程技术网

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

Ios 使用[NSObject load]初始化没有自动释放池的系统,ios,autorelease,Ios,Autorelease,我正在使用Xcode 4.3.2和iOS模拟器编写一个iPad应用程序。我有一系列的类,我想在启动时向单例注册,以便其他类可以通过这些注册的类提供的单例请求服务 为了实现这种行为,我一直依赖于重写NSObject上的load类方法。但是,我发现在设置自动释放池之前,load方法执行的所有代码都发生在主函数之外。我在我的应用程序中使用了一些当前禁止使用或自动引用计数的第三方技术,因此我需要依靠自动释放池来帮助管理创建对象的生存期 在注册过程中,模拟器的调试控制台中会出现许多消息,抱怨在没有自动释放

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

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

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

我不清楚这些调试消息有多严重。我怀疑字典的分配可能没有问题,因为单例应该在应用程序的生命周期中存在,而且字典可能永远不会发布。同样地,字典中存储的块也应该保持不变,因此我想知道在调用copy方法之后是否不需要麻烦调用autorelease

或者,也许有另一种方法可以实现我想要的,而不必求助于目前可能问题较少的技术


关于这个问题,人们有什么建议?

您应该更幸运地重写
+[NSObject initialize]
而不是
加载
初始化
在类第一次被引用时调用,而不是在类所在的映像被加载时调用。这将使您更好地处理所有这些问题。

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

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

我认为这对我的目的不起作用。我希望对象自动向singleton注册。不会引用对象来调用initialize方法。无论对象是否已被使用,都会调用load方法。然后在load方法中设置您自己的池,因为我没有正确地执行操作。如果我理解上面的代码,它看起来是为了帮助实施单例模式。我已经有了一个解决方案,尽管上面的代码看起来更简单。我关心的不是强制执行独生子女。问题是,当第一次需要单例时,没有可用的自动释放池,因为对象正试图使用+load方法自动向其注册,该方法在主函数执行之前获取每个类的调用。