Функция загрузки Objective-C + с dispatch_once - PullRequest
1 голос
/ 02 ноября 2019
+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        //do my job
    });
}

Мне просто интересно, если класс с функцией + load вызывается только один раз перед main, так зачем нужно писать dispatch_once внутри?

1 Ответ

0 голосов
/ 02 ноября 2019

Мне просто интересно, если класс с функцией + load вызывается только один раз перед основным, метод

A +load не вызывается "один раз перед основным", хотя это может быть общимв этом случае он вызывается один раз средой выполнения после загрузки образа, частью которого он является, и с динамически загружаемыми изображениями (см. Инициализация классов Objective C в программировании динамической библиотеки AppleТемы ), которые могут быть после main - см. Документацию +load .

, так зачем нужно писать dispatch_once внутри?

Если ваш код никогда напрямую не вызывает +load, то, похоже, не нужно , хотя нет явного обсуждения безопасности потоков в Темах программирования динамической библиотеки или в +loadДокументация, как и для метода +initialize.

Однако +load - это просто метод, и его можно вызывать напрямую, хотя это было бы необычно, поэтому, возможно, автор просто использовал dispatch_once изизобилие осторожности, номы действительно не можем знать.

(Примечание: метод +initialize может быть вызван более одного раза во время выполнения из-за наследования. Однако, поскольку +initialize является поточно-ориентированным, можно использовать простой тест, чтобы убедиться, что код запускается только один раз, поэтому нет необходимости использовать dispatch_once.)

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...