Chaolong
Chaolong
Demo3列表快速滑动(大概一半);这时候开始渲染图片,如果马上开始滑动,会卡住大概半秒钟。FluencyMonitor并没有捕捉到这个问题,原因是主线程卡住了,而且excuting属性没有设置为YES。为什么会造成这样的现象?我的猜测是,图片在渲染绘制的时候,接收到了触摸事件,这时候runloop还没完成,但是已经对观察者kCFRunLoopAfterWaiting,而图片绘制也是在这个阶段,而且它的observer优先级设置成了最低,所以调用绘制图片的observer的时候,excuting已经设置为NO,没有捕捉到图片绘制的时间。 为了验证这一想法,我把代码改成这样: ```objc _observer = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, LONG_MAX, &runLoopObserverCallBack, &context); ``` 设置成优先级最低,测试一下,发现卡顿能检测到了。而我把优先级设置成 LONG_MAX-1则不行,应该验证了我的想法。
```objc + (void)monitorThreadEntryPoint { @autoreleasepool { [[NSThread currentThread] setName:@"FluencyMonitor"]; NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; [runLoop run]; } } ``` 有哪些对象需要尽快回收?