Objective c 带+的单体安全;(空)荷载

Objective c 带+的单体安全;(空)荷载,objective-c,ios,macos,Objective C,Ios,Macos,我刚刚查看了NSObject的头文件,我正在创建一个singleton类。我遇到的问题是,它基本上需要从应用程序开始加载,因为singleton通过观察NSNotifications并在请求时报告当前状态来维护应用程序的状态 我的解决方案是在NSObject上使用+(void)load方法。当类加载到内存中时,我将重写load方法,并在该阶段分配singleton 苹果的文档没有明确说明在加载方法期间调用[[[*class*alloc]init]是否安全。我通常认为是的,除非有文档记录,但考虑到

我刚刚查看了NSObject的头文件,我正在创建一个singleton类。我遇到的问题是,它基本上需要从应用程序开始加载,因为singleton通过观察NSNotifications并在请求时报告当前状态来维护应用程序的状态

我的解决方案是在NSObject上使用
+(void)load
方法。当类加载到内存中时,我将重写load方法,并在该阶段分配singleton

苹果的文档没有明确说明在加载方法期间调用
[[[*class*alloc]init]
是否安全。我通常认为是的,除非有文档记录,但考虑到这个项目的重要性,以及每次应用程序启动时我都会加载这个项目的事实,我想知道任何人都知道这是否安全,只是为了确保安全


非常感谢您的帮助。

这取决于您调用
init
时类(及其超类)的具体操作。在
加载期间
,不保证其他类可用。如果您的类的
init
不需要任何其他类,那么您可以不使用它


+(void)initialize
中执行此操作会更安全,如果有必要,可以在应用程序启动期间调用设置函数(例如,在iOS上从
应用程序:didfishlaunchingwithoptions:
)。

是的,这将起到作用。这里的关键是+(void)initialize在每个类(!)的程序初始化时只调用一次。对于每个类,都意味着不需要调用[super initialize]。另一方面,它被保存到code+initialize,这样当它被调用两次时,不会产生任何错误或内存泄漏,因为子类的编码器恰好在子类“+initialize方法”中调用了[super initialize]。因此,您应该能够使用它来创建唯一的单例实例。另一方面,+init可能更好。+(void)initialize带来的问题在苹果的文档中有记录:“运行时在类或从它继承的任何类从程序内部发送第一条消息之前,向程序中的每个类发送initialize,只发送一次。(因此,如果不使用该类,则可能永远不会调用该方法。)“-我正在开发一个静态库,用户无法知道如何在加载时调用此方法。对象必须自己创建其单例,以便从一开始就监视状态,无论是否使用它。这就是我避免+(void)初始化的原因。