objective-c - 何时何地从任意消息返回值初始化外部变量?

标签 objective-c cocoa variables initialization extern

我正在从事的项目存储一些像这样的常量字符串:
(.h)

extern NSURL *kURLLocationComputer;

我需要按如下方式初始化它们:
(.mm)

NSURL *kURLLocationComputer;

... {
      kURLLocationComputer = [[NSURL alloc] initWithString:@"computer:///"];
... }

问题是它们在项目中的很多地方都被使用,并且需要首先初始化它们。但由于某些初始化很复杂(不是恒定的),因此它们无法内联完成。

我应该如何确保它们在使用前已初始化?我正在考虑添加一个虚拟类并初始化 +load 中的变量,但我没有认为我们可以假设 Cocoa 库类到那时就可以工作了。

最佳答案

经过一番研究,发现__attribute__((constructor))函数保证在调用+load之后被调用所有类(class)。来自关于 +load 的 NSObject 文档:

The load message is sent to classes and categories that are both dynamically loaded and statically linked, but only if the newly loaded class or category implements a method that can respond.

The order of initialization is as follows:

  1. All initializers in any framework you link to.
  2. All +load methods in your image.
  3. All C++ static initializers and C/C++ __attribute__(constructor) functions in your image.
  4. All initializers in frameworks that link to you.

关于objective-c - 何时何地从任意消息返回值初始化外部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14152376/

相关文章:

macos - NS窗口跟踪

cocoa 和可执行文件

variables - 如何在 Jekyll 中的 DRY 模板和 ninclude 之间传递变量

asp.net-mvc - 将 URL 中的问号和变量 (?id=5) 更改为 asp.net MVC 4 中的斜杠 (/5)

objective-c - ExtAudioFileWrite仅写入文件的第一位

ios - 管理从普通 NavigationBar 到透明 NavigationBar 的转换

ios - 在 iOS 中从 Kinvey 下载文件

ios - 如何解决 CALayer 异常?

c++ - OpenCV 在新图像中旋转、扭曲和平移 ROI

php - 变量的乘法和除法