8.2 +load: Выполнение кода до main
Этот раздел предназначен для среды выполнения GNU Objective-C. Если вы используете другую среду выполнения, можете его пропустить.
Среда выполнения GNU Objective-C предоставляет способ выполнения кода до того, как выполнение программы войдёт в функцию `main`. Код выполняется на основе класса и категории через специальный метод класса `+load`.
Этот механизм очень полезен, если вы хотите инициализировать глобальные переменные, к которым программа может получить прямой доступ, не отправляя сообщение классу предварительно. Обычный способ инициализации глобальных переменных в методе `init` может быть неэффективен, так как `init` вызывается только при отправке первого сообщения объекту класса, что в некоторых случаях может быть слишком поздно.
Предположим, у вас есть класс `MyClass`, который объявляет `myVar1`, `myVar2` и `myVar3` как глобальные переменные, как показано ниже:
FileStream *Stdin = nil;
FileStream *Stdout = nil;
FileStream *Stderr = nil;
@implementation FileStream
+ (void)initialize
{
Stdin = [[FileStream new] initWithFd:0];
Stdout = [[FileStream new] initWithFd:1];
Stderr = [[FileStream new] initWithFd:2];
}
/* Other methods here */
@end
В этом примере инициализация `myVar1`, `myVar2` и `myVar3` в `init` происходит слишком поздно. Программист может отправить сообщение одному из этих объектов до фактической инициализации переменных, тем самым отправляя сообщения объекту `MyClass`. Метод `+initialize`, который фактически инициализирует глобальные переменные, не вызывается до отправки первого сообщения объекту класса. Решением будет инициализация этих переменных непосредственно перед входом в `main`.
Правильным решением вышеуказанной проблемы является использование метода `+load` вместо `+initialize`:
@implementation FileStream
+ (void)load
{
Stdin = [[FileStream new] initWithFd:0];
Stdout = [[FileStream new] initWithFd:1];
Stderr = [[FileStream new] initWithFd:2];
}
/* Other methods here */
@end
Метод `+load` не переопределяется категориями. Если класс и его категория оба реализуют `+load`, оба метода вызываются. Это позволяет выполнить дополнительную инициализацию в категории.
Этот механизм не предназначен для замены `+initialize`. Следует учитывать его ограничения, когда вы решаете использовать его вместо `+initialize`.
| • Что можно и что нельзя делать в +load: |
Далее: Кодирование типов, Предыдущее: API среды выполнения GNU Objective-C, Наверх: Objective-C [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Executing-code-before-main.html