一砰逻、RunLoop的認(rèn)識
二、RunLoop對象
RunLoop源碼:
三寡喝、RunLoop相關(guān)類
切換mode不會導(dǎo)致程序退出拯田。
1.CFRunLoopModeRef
- sources0
-
observer
代碼如下:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
//在線程中創(chuàng)建的runloop對象都是放在一個全局的字典中,例如:
//NSMutableDictionary *runloops;
void observeRunLoopActicities(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
{
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"kCFRunLoopEntry");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"kCFRunLoopBeforeTimers");
break;
case kCFRunLoopBeforeSources:
NSLog(@"kCFRunLoopBeforeSources");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"kCFRunLoopBeforeWaiting");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"kCFRunLoopAfterWaiting");
break;
case kCFRunLoopExit:
NSLog(@"kCFRunLoopExit");
break;
default:
break;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
// NSRunLoop *runloop;
// CFRunLoopRef runloop2;
// runloops[thread] = runloop;
// NSRunLoop *runloop = [NSRunLoop currentRunLoop];
// CFRunLoopRef runloop2 = CFRunLoopGetCurrent();
// NSArray *array;
// CFArrayRef arry2;
//
// NSString *string;
// CFStringRef string2;
// NSLog(@"%p %p", [NSRunLoop currentRunLoop], [NSRunLoop mainRunLoop]);
// NSLog(@"%p %p", CFRunLoopGetCurrent(), CFRunLoopGetMain());
// 數(shù)組是有序的
// NSMutableArray *array;
// [array addObject:@"123"];
// array[0];
// 集合是無序的
// NSMutableSet *set;
// [set addObject:@"123"];
// [set anyObject];
//
// kCFRunLoopDefaultMode;
// NSDefaultRunLoopMode;
// NSLog(@"%@", [NSRunLoop mainRunLoop]);
// self.view.backgroundColor = [UIColor redColor];
// kCFRunLoopCommonModes默認(rèn)包括kCFRunLoopDefaultMode础锐、UITrackingRunLoopMode
// 創(chuàng)建Observer
// CFRunLoopObserverRef observer = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, observeRunLoopActicities, NULL);
// // 添加Observer到RunLoop中
// CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
// // 釋放
// CFRelease(observer);
// 創(chuàng)建Observer
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
switch (activity) {
case kCFRunLoopEntry: {
CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
NSLog(@"kCFRunLoopEntry - %@", mode);
CFRelease(mode);
break;
}
case kCFRunLoopExit: {
CFRunLoopMode mode = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());
NSLog(@"kCFRunLoopExit - %@", mode);
CFRelease(mode);
break;
}
default:
break;
}
});
// 添加Observer到RunLoop中
CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);
// 釋放
CFRelease(observer);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// [NSTimer scheduledTimerWithTimeInterval:3.0 repeats:NO block:^(NSTimer * _Nonnull timer) {
// NSLog(@"定時器-----------");
// }];
}
@end