Runloop

2016-08-03  本文已影响793人  学而不思则罔思而不学则殆

什么是 RunLoop?

RunLoop对象

iOS 中有2套API来访问和使用RunLoop

RunLoop和线程

获取 RunLoop 对象

RunLoop相关类

Core Foundation 中关于 RunLoop 的5个类

CFRunLoopModeRef

苹果公开提供的mode有俩个: NSDefaultRunLoopMode (kCFRunLoopDefaultMode), NSRunLoopCommonModes (kCFRunLoopCommonModes)

CFRunLoopTimerRef

CFRunLoopSourceRef

CFRunLoopObserverRef

CFRunLoopObserverRef observer =
CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),
kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer,
CFRunLoopActivity activity) {
NSLog(@"----􁍊􀞍􀚩RunLoop􁇫􀮾􀝎􁊞􀶯􀝒---%zd", activity);
});
// 􁂲􀛒􁥡􀩊􁘏􀒓􁍊􀞍RunLoop􁌱􁇫􀮾
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer,
kCFRunLoopDefaultMode);
// 􁯽􀶱Observer
CFRelease(observer);

RunLoop处理逻辑

RunLoop的应用

RunLoop 定时源和输入源

NSRunLoop 的实现机制, 以及在多线程中如何使用

RunLoop和线程有什么关系?

autorelease 对象在什么情况下会被释放?

测试, RunLoop 的理解不正确的是?

 A 每一个线程都有其对应的RunLoop
 B 默认非主线程的RunLoop是没有运行的
 C 在一个单独的线程中没有必要去启用RunLoop
 D 可以将NSTimer添加到runloop中

RunLoop 的 Mode 作用是什么?

mode 主要是用来指定时间在运行循环中的优先级, 分为:
苹果公开提供的 Mode 有俩个:

测试, 请写出 NSTimer 使用时的注意事项

思路: 如果想要销毁 timer , 应该先把 timer 置为失效, 否则 timer 就一直占用内存而不会释放. 造成逻辑上的内存泄漏. 而且这种泄漏不能用 Xcode 和 instruments 测出来. 未将 timer 置为失效, 每次创建一次, 则之前的不能得到释放, 那么同时存在多个 timer 的实例在内存中.

参考答案:

测试, UITableViewCell 上有个 UILabel, 显示 NSTimer 实现的秒表时间, 手指滚动 cell 过程中, label 是否刷新, 为什么?

思路同上, 自己作答.

测试, 为什么 UIScrollView 的滚动会导致 NSTimer 失效?

思路同上, 自己作答.

测试, 在滑动页面上的列表, timer 会暂停回调, 为什么? 如何解决?

思路同上, 自己作答.

在开发中如何使用 RunLoop? 什么应用场景?

上一篇下一篇

猜你喜欢

热点阅读