runloop

关于iPhone的UIView刷新

蓝咒 提交于 2020-04-04 12:38:57
大家应该都比较清楚如果想要刷新一个UIView的话,调用它的setNeedsDisplay即可。 问题是,当你调用了一个UIView的setNeedsDisplay之后,该UIView何时才得到刷新? 经过调研发现,应该是在一个runloop的最后阶段刷新。 什么是一个runloop呢?个人认为可以简单的理解为了一个事件的处理过程。 例如用户点击屏幕是两个runloop。 当用户按下的时候,...一系列处理->UIView的touchesBegan函数->一系列处理 这里是一个runloop 当用户抬起的时候,...一系列处理->UIView的touchesEnd函数->一系列处理 这里是另一个runloop 通常情况下,在UIView的touches事件处理函数中调用setNeedsDisplay能保证在下一次touches事件之前界面被刷新( 不过不管你在一个touches事件处理函数中调用多少次setNeedsDisplay,界面只会被刷新一次 )。 但是也有一些例外。例如UIScrollView。 因为UIScrollView要判定当前的用户操作是不是拖动,因此它会延迟回调touches处理函数。可能出现在一个runloop中同时回调多次touches处理函数。 如果你在UIScrollView touchesBegan里面做了一些改变界面的事情

iOS 头条一面 面试题

放肆的年华 提交于 2020-03-24 13:26:27
3 月,跳不动了?>>> 1、如何高效的切圆角? 切圆角共有以下三种方案: cornerRadius + masksToBounds:适用于单个视图或视图不在列表上且量级较小的情况,会导致离屏渲染。 CAShapeLayer+UIBezierPath:会导致离屏渲染,性能消耗严重,不推荐使用。 Core Graphics:不会导致离屏渲染,推荐使用。 2、什么是隐式动画和显式动画? 隐式动画指的是改变属性值而产生的默认的过渡动画(如background、cornerRadius等),不需要初始化任何类,系统自己处理的动画属性;显式动画是指自己创建一个动画对象并附加到layer上,如 CAAnimation、CABasicAnimation、CAKeyframeAnimation 。 3、UIView 和 CALayer 的区别? UIView 是 CALayer 的 delegate,UIView 可以响应事件,而 CALayer 则不能。 4、离屏渲染? iOS 在不进行预合成的情况下不会直接在屏幕上绘制该图层,这意味着 CPU 和 GPU 必须先准备好屏幕外上下文,然后才能在屏幕上渲染,这会造成更多时间时间和更多的内存的消耗。 5、Objective - C 是否支持方法重载(overloading)? 不支持。方法重载(overloading)

iOS runloop初步学习

China☆狼群 提交于 2020-03-20 03:05:04
参考: http://www.aichengxu.com/view/4329711 1. 定义: 其实它内部就是do-while循环,在这个循环内部不断地处理各种任务(比如Source、Timer、Observer),能让线程不被系统终止 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop runloop常用的三种模式: NSDefaultRunLoopMode:runloop默认的模式,程序启动模式主线程的runloop就是在NSDefaultRunLoopMode模式下运行的。 UITrackingRunLoopMode:runloop在用户点击或触摸屏幕时,会自动切换到该模式。 NSRunLoopCommonModes:指标记为common modes的所有模式,即前两者的集合。 2. 作用 可以使用runloop, 在一个子线程中长期监控某个事件 - (void)viewDidLoad { [super viewDidLoad]; // 开启一个线程让它执行run方法,如果run方法过了,线程就会死掉 self.thread = [[NSThread

RunLoop 总结及应用

纵饮孤独 提交于 2020-03-20 03:04:20
什么是RunLoop 注释:和ppt上总结的一样 和代码一块去理解 从字面上看 运行循环 跑圈 循环 基本作用 保持程序的持续运行(比如主运行循环) 处理App中的各种事件(比如触摸事件、定时器事件、Selector事件) 节省CPU资源,提高程序性能:该做事时做事,该休息时休息 存在价值 没有RunLoop 有RunLoop main函数中的RunLoop(主运行循环) 主运行循环 第14行代码的UIApplicationMain函数内部就启动了一个RunLoop 所以UIApplicationMain函数一直没有返回,保持了程序的持续运行 这个默认启动的RunLoop是跟主线程相关联的 RunLoop对象 iOS中有2套API来访问和使用RunLoop Foundation NSRunLoop Core Foundation CFRunLoopRef NSRunLoop和CFRunLoopRef都代表着RunLoop对象 NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面) RunLoop资料 苹果官方文档 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual

李洪强经典面试题145-Runloop

社会主义新天地 提交于 2020-03-20 02:11:38
李洪强经典面试题145-Runloop Runloop 什么是 Runloop? 从字面上讲就是运行循环。 它内部就是do-while循环,在这个循环内部不断地处理各种任务。 一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop得手动启动(调用run方法) RunLoop只能选择一个Mode启动,如果当前Mode中没有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop 基本的作用就是保持程序的持续运行,处理app中的各种事件。通过runloop,有事运行,没事就休息,可以节省cpu资源,提高程序性能。 Runloop对象 iOS中有2套API来访问和使用RunLoop Foundation:NSRunLoop Core Foundation:CFRunLoopRef NSRunLoop和CFRunLoopRef都代表着RunLoop对象 NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API。 Runloop与线程 每条线程都有唯一的一个与之对应的RunLoop对象 主线程的RunLoop已经自动创建好了,子线程的RunLoop需要主动创建 RunLoop在第一次获取时创建,在线程结束时销毁

备战2020:那些 iOS开发 常用的底层面试题合集!

心不动则不痛 提交于 2020-03-12 19:06:28
一、Runtime 一个objc对象的isa的指针指向什么?有什么作用? 一个 NSObject 对象占用多少内存空间? 说一下对 class_rw_t 的理解? 说一下对 class_ro_t 的理解? 说一下对 isa 指针的理解 说一下 Runtime 的方法缓存?存储的形式、数据结构以及查找的过程? 使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么? 实例对象的数据结构? 什么是method swizzling(俗称黑魔法) 什么时候会报unrecognized selector的异常? 如何给 Category 添加属性?关联对象以什么形式进行存储? 能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么? 类对象的数据结构? runtime如何通过selector找到对应的IMP地址? runtime如何实现weak变量的自动置nil?知道SideTable吗? objc中向一个nil对象发送消息将会发生什么? objc在向一个对象发送消息时,发生了什么? isKindOfClass 与 isMemberOfClass Category 在编译过后,是在什么时机与原有的类合并到一起的? Category 有哪些用途? Category 的实现原理? _objc_msgForward函数是做什么的

iOS RUN LOOP 是个什么东西?

点点圈 提交于 2020-03-08 09:53:39
RUN Loop是什么? 1。 runloop是事件接收和分发机制的一个实现。 2。什么时候使用runloop 当需要和该线程进行交互的时候。主线程默认有runloop。当自己启动一个线程,如果只是用于处理单一的事件,则该线程在执行完之后就退出了。所以当我们需要让该线程即监听某项事务事,就得让线程一直不退出,runloop就是这么一个循环,没有事件的时候,一直卡着,有事件来临了,执行其对应的函数 3。run loop需要处理的event source 有两种:input sources(常是其他线程的异步的event)和 timer sources(定时器)。 Anatomy of a Run Loop run loop,正如其名称所示,是线程进入和被线程用来响应事件以及调用事件处理函数的地方。需要在代码中使用控制语句实现run loop的循环,也就是说,需要代码提供while 或者 for循环来驱动run loop。在这个循环中,使用一个runloop对象[NSRunloop currentRunloop]执行接收消息,调用对应的处理函数。 runloop接收来自两种源事件,input sources和timer sources。前者传递异步事件,通常是来自其他线程和不同的程序中的消息;后者传递同步事件(重复执行或者在特定时间上触发)

理解Autorelease pool

落爺英雄遲暮 提交于 2020-03-07 18:40:26
如果你能够真正的理解autorelease,那么你才是理解了Objective c的内存管理。Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。 [1]在Iphone项目中,大家会看到一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release, 这样跟内存泄露有什么区别? 答案是,对于每一个Runloop, 系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。 那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。Autorelease是保证一个method安全的,对于method中的函数调用也适用。例子如下: NSString* globalObject; -

Autorelease Pool

帅比萌擦擦* 提交于 2020-03-07 18:39:29
现在已经是 ARC 时代了,但是了解更多的 Objective-C 的内存管理机制仍然是十分必要的。一直以来我都弄不清楚 autorelease 的原理,后面看了很多资料,才慢慢了解到 autorelease 的原理。 - (void)test { NSString *string = [NSString stringWithFormat:@"liuluoxing"]; NSString *string_weak_ = string; } 下面我们来捋一捋这个变量的内存引用计数的变化: 1.当使用 [NSString stringWithFormat:@"liuluoxing"] 创建一个对象时,这个对象的引用计数为 1 ,并且这个对象被系统自动添加到了当前的 autoreleasepool 中。 2.当使用局部变量 string 指向这个对象时,这个对象的引用计数 +1 ,变成了 2 。 3.当变量出了当前作用域时,局部变量 string 变成了 nil ,所以其所指向对象的引用计数变成 1 。 4.当出了 @autoreleasepool {} 的作用域时,其中的 autoreleased 对象被 release ,对象的引用计数变成 1 。当出了局部变量 string 的作用域,即 viewDidLoad 方法返回时,string 指向了 nil ,其所指向对象的引用计数变成

Autorelease机制讲解

妖精的绣舞 提交于 2020-03-07 18:34:27
Autorelease机制是在iOS内存管理中的一员。在MRC中,是通过调用 [obj autorelease] 来延迟内存释放;在ARC中,我们已经完全不需要知道Autorelease就能很好地管理好内存。而在这背后,Objective-C帮我们做了什么呢,又是如何正确的管理好内存呢,下面我们来讲解Autorelease机制,希望大家对Autorelease有所进一步的了解!!! Autorelease对象什么时候释放呢? 我不知道大家在面试的时候,有没有遇到过这样的问题,本人在悦动天下面试遇到过。如果拿Autorelease对象什么时候释放拿来做面试题,可能正确回答上来的没有几个,大家可能都会回答,“当前作用域也就是大括号结束时释放”,如果这样回答,显然没有正确很好地理解Autorelease机制。 在如果没有手动加Autorelease Pool情况下,Autorelease对象是在当前 runloop 迭代结束之后才会释放, 释放的原因是因为系统在每个runloop迭代中都已经加入了自动释放池push和pop。 (每个runloop都会创建一个autoreleasepool并在runloop迭代结束之后进行释放) 下面是一段代码讲述ARC与MRC的autorelease的使用,如下: // MRC NSAutoreleasePool *pool =