runloop

iOS面试题--Runloop篇

左心房为你撑大大i 提交于 2020-03-07 16:11:16
1.Runloop 和线程的关系? 一个线程对应一个 Runloop。 主线程的默认就有了 Runloop。 子线程的 Runloop 以懒加载的形式创建。 Runloop 存储在一个全局的可变字典里,线程是 key ,Runloop 是 value。 2.RunLoop的运行模式 RunLoop的运行模式共有5种,RunLoop只会运行在一个模式下,要切换模式,就要暂停当前模式,重写启动一个运行模式 - kCFRunLoopDefaultMode, App的默认运行模式,通常主线程是在这个运行模式下运行 - UITrackingRunLoopMode, 跟踪用户交互事件(用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响) - kCFRunLoopCommonModes, 伪模式,不是一种真正的运行模式 - UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用 - GSEventReceiveRunLoopMode:接受系统内部事件,通常用不到 3.runloop内部逻辑? 实际上 RunLoop 就是这样一个函数,其内部是一个 do-while 循环。当你调用 CFRunLoopRun() 时,线程就会一直停留在这个循环里;直到超时或被手动停止,该函数才会返回。 内部逻辑: 通知

iOS中设计一个Block代码执行的UIAlertView

老子叫甜甜 提交于 2020-03-02 17:14:06
Windows下的AlertView(比如java的MessageBox, JS的alert('title'))都是阻塞代码继续执行的,举个例子 int result = window.confirm('你会点击取消按钮么?'); console.log("If I havn't confirm, I won't be logged."); if (result == 1) { // some code } iOS原生提供的UIAlertView就不能实现类似的效果,但是依旧可以自己Custom实现,本篇博客将介绍如何在iOS下实现类似windows这样的弹出框,如果不点击确认按钮则不执行后续的代码。 先简单介绍一下iOS中的UIAlertView:UIAlertView是以回调的形式通知调用方,调用完show方法之后,后续的代码可以继续执行,等AlertView处理完之后,会异步通知掉用方我刚才进行了什么操作。 在开始这篇文章之前,你需要准备一些知识(NSRunloop),很多博客有专门的介绍,为了避免重复的博客,在这里不做详细的介绍。如果你还没有了解,那么你得先去了解,可以直接Google NSRunloop 或者直接看官方文档 Threading Programming Guide: Run Loops ,或者如果你不想了解Runloop,如果你有需求

performSelector:相关的知识

左心房为你撑大大i 提交于 2020-03-02 16:37:19
来看一个例子: #import <Foundation/Foundation.h> @interface MyTst : NSObject - ( void ) print; @end @implementation MyTst - ( void ) print { NSLog ( @"xxxxxxxxxx" ); } @end #import <UIKit/UIKit.h> #import "AppDelegate.h" #import "MyTst.h" int main( int argc, char * argv[]) { // @autoreleasepool { // return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); // } MyTst *myClass = [[ MyTst alloc ] init ]; // 1 [myClass performSelector:@selector(print) withObject:nil afterDelay:0]; //2 [myClass performSelector : @selector (print) withObject : nil]; return 0 ; } 上面的代码1、和2 会执行吗?

RunLoop相关知识点

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-02 14:25:31
NSRunLoop类声明的编程接口对象管理输入源。NSRunLoop对象处理鼠标和键盘等输入来源来自窗口系统的事件,NSPort对象,NSConnection对象。还一个NSRunLoop对象流程NSTimer事件 - (void)addTimer:(NSTimer *)timer forMode:(NSString *)mode; + (NSRunLoop *)currentRunLoop; + (NSRunLoop *)mainRunLoop NS_AVAILABLE(10_5, 2_0); 消息处理模式,对消息处理过程进行了更好的抽象和封装 1.输入事件来源:输入源(input source)和定时源(timer source).使用程序的某一特定的处理例程来处理到达的事件。 当你创建输入源,你需要将其分配给runloop中的一个或多个模式。模式只会在特定事件影响监听的源。大多数情况下,runloop运行在默认模式下,但是你也可以使其运行在自定义模式下。若某一源在当前模式下不被监听,那么任何其生成的消息只在runloop运行在其关联的模式下才会被传递。 传递异步事件,通常消息来自于其他线程或程序。输入源传递异步消息给相应的处理例程,并调用runUntilDate:方法来退出(在线程里面相关的NSRunLoop对象调用) 1.1 基于端口的输入源由内核自动发送

优化UITableViewCell高度计算的那些事

丶灬走出姿态 提交于 2020-03-01 03:39:51
我是前言 这篇文章是我和我们团队最近对 UITableViewCell 利用 AutoLayout 自动高度计算和 UITableView 滑动优化的一个总结。 我们也在维护一个开源的扩展,UITableView+FDTemplateLayoutCell,让高度计算这个事情变的前所未有的简单,也受到了很多星星的支持, github链接请戳我 这篇总结你可以读到: UITableView高度计算和估算的机制 不同iOS系统在高度计算上的差异 iOS8 self-sizing cell UITableView+FDTemplateLayoutCell如何用一句话解决高度问题 UITableView+FDTemplateLayoutCell中对RunLoop的使用技巧 UITableViewCell高度计算 rowHeight UITableView是我们再熟悉不过的视图了,它的 delegate 和 data source 回调不知写了多少次,也不免遇到 UITableViewCell 高度计算的事。UITableView 询问 cell 高度有两种方式。 一种是针对所有 Cell 具有固定高度的情况,通过: 1 self .tableView .rowHeight = 88 ; 上面的代码指定了一个所有 cell 都是 88 高度的 UITableView,对于定高需求的表格,

IOS调试lldb命令常用,po,

杀马特。学长 韩版系。学妹 提交于 2020-02-27 12:36:06
lldb命令常用(备忘) 假如你准备在模拟器里面运行这个,你可以在“(lldb)”提示的后面输入下面的: (lldb) po $eax LLDB在xcode4.3或者之后的版本里面是默认的调试器。假如你正在使用老一点版本的xcode的话,你又GDB调试器。他们有一些基本的相同的命令,因此假如你的xcode使用的是“(gdb)”提示,而不是“(lldb)”提示的话,你也能够更随一起做,而没有问题。 “po”命令是“print object”(打印对象)的简写。“$eax”是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里面工作,假如你在设备上调试,你将需要使用”$r0″寄存器。 例如,假如你输入: (lldb) po [$eax class] 你将会看像这样的东西: (id) $2 = 0x01446e84 NSException 这些数字不重要,但是很明显的是你正在处理的NSException对象在这里。 你可以对这个对象调用任何方法。例如: (lldb) po [$eax name] 这个将会输出这个异常的名字,在这里是NSInvalidArgumentException,并且: (lldb) po [$eax reason] 这个将会输出错误消息: (unsigned int) $4 = 114784400

iOS 定时器的比较

荒凉一梦 提交于 2020-02-11 05:57:23
然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资料,大概有三种方法:NSTimer、CADisplayLink、GCD。接下来我就一一介绍它们的用法。 一、NSTimer 1. 创建方法 1 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO]; TimerInterval : 执行之前等待的时间。比如设置成1.0,就代表1秒后执行方法 target : 需要执行方法的对象。 selector : 需要执行的方法 repeats : 是否需要循环 2. 释放方法 1 [timer invalidate]; 注意 : 调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法。 3. 特性 存在延迟 不 管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。重复性的timer遇到这种情况,如果延迟超过了一个周期,则 会在延时结束后立刻执行

GCD实现多个定时器,完美避过NSTimer的三大缺陷(RunLoop、Thread、Leaks)

落花浮王杯 提交于 2020-02-11 01:04:39
定时器在我们每个人做的iOS项目里面必不可少,如登录页面倒计时、支付期限倒计时等等,一般来说使用NSTimer创建定时器: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; But 使用NSTimer需要注意一下几点: 1、必须保证有一个活跃的RunLoop。 系统框架提供了几种创建NSTimer的方法,其中以scheduled开头的方法会自动把timer加入当前RunLoop,到了设定时间就会触发selector方法,而没有scheduled开头的方法则需要手动添加timer到一个RunLoop中才会有效。程序启动时,会默认启动主线程的RunLoop并在程序运行期内有效

iOS 多线程相关 线程组

别说谁变了你拦得住时间么 提交于 2020-02-06 16:58:25
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ dispatch_queue_t queue = dispatch_get_global_queue(0, 0); dispatch_async(queue, ^{ NSLog(@"1"); //这句话的本质是往runloop中添加定时器 [self performSelector:@selector(test) withObject:nil afterDelay:.0]; NSLog(@"3"); //若不启动runloop 子线程中是不会执行定时器的 打印结果为 1 3 执行了 打印结果为 1 3 2 [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; }); } -(void)test{ NSLog(@"2"); } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSThread *thred = [[NSThread alloc]initWithBlock:^{ NSLog(@"1")

HTTP和GET/POST请求(NSURLConnection)

耗尽温柔 提交于 2020-01-30 19:19:20
网络编程 网络编程是一种实时更新应用数据的常用手段 网络编程是开发优秀网络应用的前提和基础 网络基本概念 客户端(就是手机或者ipad等手持设备上面的APP) 服务器(远程服务器-本地服务器) 请求(客户端索要数据的方式) 响应(需要客户端解析数据) 数据库(服务器的数据从哪里来) HTTP URL 如何找到服务器(通过一个唯一的URL) URL介绍 统一资源定位符 url格式(协议\主机地址\路径) 协议:不同的协议,代表着不同的资源查找方式、资源传输方式 主机地址:存放资源的主机(服务器)的IP地址(域名) 路径:资源在主机(服务器)中的具体位置 请求协议 【file】访问的是本地计算机上的资源,格式是file://(不用加主机地址) 【ftp】访问的是共享主机的文件资源,格式是ftp:// 【mailto】访问的是电子邮件地址,格式是mailto: 【http】超文本传输协议,访问的是远程的网络资源,格式是http://(网络请求中最常用的协议) HTTP协议 简介 a.超文本传输协议 b.规定客户端和服务器之间的数据传输格式 c.让客户端和服务器能有效地进行数据沟通 优缺点 a.简单快速(协议简单,服务器端程序规模小,通信速度快) b.灵活(允许传输各种数据) c.非持续性连接(1.1之前版本是非持续的,即限制每次连接只处理一个请求,服务器对客户端的请求做出响应后