Я использую один и тот же код на двух платформах iOS и macOSX для тестирования, просмотра переключателя активности Runloop, обнаружил, что результаты двух платформ не совпадают, в чем причина.
Код:
1. создать RunLoop Observer
CFRunLoopObserverContext context = {0,(__bridge void*)self, NULL, NULL, NULL};
_observer = CFRunLoopObserverCreate(kCFAllocatorDefault,
kCFRunLoopAllActivities,
YES,
0,
&runLoopObserverCallBack,
&context);
CFRunLoopAddObserver(CFRunLoopGetMain(), _observer, kCFRunLoopCommonModes);
2. состояние активности печати
static void runLoopObserverCallBack(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info){
Monitor *monitor = (__bridge Monitor*)info;
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"activity_kCFRunLoopEntry");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"activity_kCFRunLoopBeforeTimers");
break;
case kCFRunLoopBeforeSources:
NSLog(@"activity_kCFRunLoopBeforeSources");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"activity_kCFRunLoopBeforeWaiting");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"activity_kCFRunLoopAfterWaiting");
break;
case kCFRunLoopExit:
NSLog(@"activity_kCFRunLoopExit");
break;
default:
break;
}}
Результат:
1. iOSРезультат iOS
2. macOSРезультат MacOS
Почему в системе macOS есть несколько kCFRunLoopEntry?
@RobNapier Спасибо, очевидно, из-за их разных реализаций, но я хочу знать их разные детали
Это внутренние детали реализации. Это вся информация: opensource.apple.com/source/CF/CF-1153.18/CFRunLoop.c.auto.h tml (только на Mac; iOS никогда не выпускала исходный код для CoreFoundation, а Mac остановился несколько лет назад). Дело в том, что это не то, на что можно положиться, и отличается, потому что разные реализации. Я не думаю, что есть более глубокий ответ, кроме того, что люди просто догадываются о реализации на основе поведения. Если вы считаете, что это нарушает документацию, используйте bugreport.apple.com, но я не думаю, что на ваш вопрос есть ответ.
С помощью Hopper (hopperapp.com) вы можете гораздо больше узнать, чем они отличаются друг от друга, но нет никаких обещаний, что это не изменится в будущих выпусках.





Потому что у него другая реализация на iOS; Исключения по той же причине приводят к сбою программ iOS, но прерывают только текущий цикл выполнения в macOS. Эти звонки не обещают быть в определенном порядке; это деталь реализации, и они внесли множество изменений, когда создавали ее для iOS (гораздо больше основанной на GCD, который был довольно новым в то время). Но ответ - «потому что они разные».