9.2.1 Что можно и чего нельзя делать в +load
+load следует использовать только в крайнем случае. Поскольку он выполняется очень рано, большая часть механизмов среды выполнения Objective-C ещё не будет готова к моменту выполнения +load; поэтому +load лучше всего подходит для выполнения кода C, не зависящего от среды выполнения Objective-C.
Реализация +load в среде выполнения GNU гарантирует следующее:
- вы можете написать любой код C;
- вы можете выделять память для объектов и отправлять сообщения объектам, класс которых реализован в том же файле;
- реализация
+loadвсех суперклассов класса выполняется до выполнения+loadэтого класса; - реализация
+loadкласса выполняется до реализации+loadлюбой категории.
В частности, не гарантируется следующее, даже если в отдельных случаях это может работать:
- выделение памяти для произвольных объектов или отправка им сообщений;
- выделение памяти для объектов, классы которых имеют категорию, реализованную в том же файле, или отправка таким объектам сообщений;
- отправка сообщений строковым константам Objective-C (
@"this is a constant string");
При написании +load класса не следует рассчитывать на получение +load дочерними классами-соседями. Порядок, в котором дочерние классы-соседи получают +load, не гарантирован.
Порядок вызова +load и +initialize может вызвать проблемы, если он имеет значение. Если вы не выделяете память для объектов внутри +load, гарантируется, что +load будет вызван до +initialize. Если вы создаёте объект внутри +load, вызывается метод +initialize класса объекта, даже если +load не был вызван. Обратите внимание: если вы явно вызываете +load для класса, сначала будет вызван +initialize. Чтобы избежать возможных проблем, постарайтесь реализовать только один из этих методов.
Метод +load также вызывается, когда пакет динамически загружается в работающую программу. Это происходит автоматически, без каких-либо дополнительных действий с вашей стороны. При написании пакетов, если вам нужно реализовать +load, вы можете безопасно создавать объекты и отправлять сообщения объектам, классы которых уже существуют в работающей программе. К классам, определённым в пакете, применяются те же ограничения, что и выше.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/What-you-can-and-what-you-cannot-do-in-_002bload.html