1,刨根问底 self super
知识点:
1,super 结构体
struct objc_super {
__unsafe_unretained id receiver;
__unsafe_unretained Class super_class;
};
2,class 默认实现
- (Class)class {
return object_getClass(self);
}
3,重写class 调用类方法不会递归
@implementation Father
- (Class)class{
return [Father class];
}
@end
2,Run Loop 记录与源码注释 or iOS底层原理总结 && 细节说明
Run Loop 知识点:
1,CFRunLoopPerformBlock,如果符合当前运行模式,则下一个运行时运行
2,如果运行模式不一致,不会强制切换模式,会等到下一个模式促发的运行
kCFRunLoopDefaultMode 模式下执行CFRunLoopPerformBlock,会一致等UITrackingRunLoopMode促发才执行下面代码
CFRunLoopPerformBlock(CFRunLoopGetCurrent(), (CFStringRef)UITrackingRunLoopMode, ^{
[self test];
});
- (void)test{
if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {
NSLog(@"cjw cjw isMainQueue");
}
}
3,isEqual & hash
1,isEqual 需要重写
2,hash 需要重写
4,MainQueue or MainThread
1,主队列(MainQueue)里面block 一定都在主线程执行。
GCD中将任务提交到主线程的主队列即dispatch_get_main_queue()时,这里的任务是由RunLoop负责执行。RunLoop和线程绑定。所以上面结论没毛病。
试试下面代码
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"cjw cjw %@",[NSThread currentThread]);
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"cjw cjw %@",[NSThread currentThread]);
});
});
2,主线程(MainThread)不一定都在MainQueue里面执行
下面这段代码说明MainThread可以在其他Queue里面执行
dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
if ([NSThread isMainThread]) {
NSLog(@"cjw cjw is mainthread");
}
if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0) {
NSLog(@"cjw cjw isMainQueue");
}
});