8.2.1 Что можно и нельзя делать в +load
+load следует использовать только в крайнем случае. Поскольку оно выполняется очень рано, большая часть механизма выполнения Objective-C не будет готова к моменту выполнения +load; поэтому +load лучше всего подходит для выполнения кода C, не зависящего от выполнения Objective-C.
Реализация +load в GNU runtime гарантирует вам следующее:
- вы можете писать любой код 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 вы можете безопасно создавать и отправлять сообщения объектам, классы которых уже существуют в работающей программе. Те же ограничения, что и выше, применяются к классам, определенным в пакете.
Вернуться к: Выполнение кода до main [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/What-you-can-and-what-you-cannot-do-in-_002bload.html