出处:jQuery 双击事件(dblclick)时,不触发单击事件(click) 在jQuery的事件绑定中,执行双击事件(dblclick)时能触发两次单击事件(click)。...即一个标签元素(如div等),如果元素同时绑定了单击事件(click)和双击事件(dblclick),那么执行单击事件(click)时,不会触发双击事件(dblclick), 执行双击事件(dblclick...)时却会触发两次单击事件(click)。...mouseout,click,dblclick; 在双击事件(dblclick),触发的两次单击事件(click)中,第一次的单击事件(click)会被屏蔽掉,但第二次不会。...至此,能一定程度上避免双击(dblclick)时触发单击(click)。
一.RunLoop定义 RunLoop:运行循环,简单的说就是处理线程事件和管理线程的一种机制。当子线程的事件结束时,runloop将会自动休眠,app主线程中的runloop处于一直唤醒状态。...当用户触发事件时,runloop通知线程执行事件内容。 二.线程与RunLoop的关系 1.每条线程都有唯一的一个与之对应的RunLoop对象,没有线程,也就没有RunLoop存在的必要。...Source0:非基于端口port,例如触摸,滚动,selector选择器等用户触发的事件;(只包含了一个回调函数,它并不能主动触发事件) Source1:基于端口port,一些系统事件; (包含了一个...当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。...解决NSTimer在UIScrollView滑动时停止工作的问题 默认情况下,在滚动 tableView、UIScrollView 的时候,NSTimer会停止工作,这是因为在滚动时,RunLoop
在一个dom节点的事件绑定中,如果同时绑定了dblclick和mousedown那么想要执行双击事件(dblclick)时能就会触发两次mousedown事件。...因此,触发顺序是,mousedown首先触发,mouseup接着触发,click最后触发。 dblclick事件则会在mousedown、mouseup、click之后触发。...mouseover事件和mouseenter事件,都是鼠标进入一个节点时触发。...在单击的时候(也就是鼠标按下的时候)不会执行双击,但是双击的时候会执行两次单击再执行双击事件。 解决的思路:要想双击时不执行单击事件,就使用定时器清除掉两个单击事件,留下一个双击事件。...第一次单击任务不执行了,是被定时器延时,然后第二次点击的时候给清除了。那么第二次点击事件呢? 在两次单击之后,会立马执行一个双击事件,双击事件的一开头就把这个第二次点击事件给清除了。
打印台输出: image.png 可以看出在滑动UIScrollView时,定时器被暂停了。...时继续执行,比如使用NSTimer完成的帧动画,滑动UIScrollView时就可以停止帧动画,保证滑动的流程性。...存在延迟 不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。...然而当系统休眠的时候,默认时钟是不走的,也就会导致计时器停止。...而 `NSTimer` 第一次执行是到计时器触发之后。这也是和 `NSTimer` 之间的一个显著区别。
当使用NSTimer的scheduledTimerWithTimeInterval方法时。此时Timer会被加入到当前线程的Run Loop中,且模式是默认的NSDefaultRunLoopMode。...而如果当前线程就是主线程(UI线程时),某些UI事件,比如UIScrollView的拖动操作,会将Run Loop切换成UITrackingRunLoopMode模式,在这个过程中,默认的NSDefaultRunLoopMode...模式中注册的事件是不会被执行的。...比如滑动UIScrollView的时候,NSTimer的处理时间根本没有调用,当松手的时候,又执行了。...原因:当滑动UIScrollView的时候,RunLoop切换成UITrackingRunLoopMode模式,而NSTimer默认注册NSDefaultRunLoopMode模式,所以拖动时Timer
可以看出在滑动UIScrollView时,定时器被暂停了。...时继续执行,比如使用NSTimer完成的帧动画,滑动UIScrollView时就可以停止帧动画,保证滑动的流程性。...存在延迟 不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。...然而当系统休眠的时候,默认时钟是不走的,也就会导致计时器停止。使用 dispatch_walltime 可以让计时器按照真实时间间隔进行计时....而 NSTimer 第一次执行是到计时器触发之后。这也是和 NSTimer 之间的一个显著区别。
传入给 NSTimer,在NSTimer 的 category 里面触发selector 。...从 RunLoop 的机制图中可以看到CFRunLoopTimer 存在,CFRunLoopTimer 作为 RunLoop 的事件源之一,它的上层对应就是 NSTimer,NSTimer 的触发正是基于...RunLoop模式 当调用scheduledTimerWithTimeInterval方法时,Timer会默认被加入到当前线程的RunLoop中,模式为NSDefaultRunLoopMode。...如果当前线程是主线程(UI线程),比如UIScrollView的滚动操作,RunLoop模式自动会被切换成NSEventTrackingRunLoopMode,在这个过程中,默认的NSDefaultRunLoopMode...模式中注册的事件不会被执行,也就是说此时调用scheduledTimerWithTimeInterval添加到RunLoop中的Timer不会被执行。
上面放置任何子视图的时候,当你在子视图上移动的时候,UIScrollView会给子视图发送touchCancel消息,而如果该属性设置为NO,ScollView本身不处理这个消息,全部交给子视图处理...@property(nonatomic) BOOL canCancelContentTouches; //28.自定义默认行为,当手指触摸在显示的内容由子类重写 - (BOOL)touchesShouldBegin...滚动动画停止时执行代码改变时触发,也就是setContentOffset改变的时候 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *...: 文字改变事件(UITextField) 通过delegate 只有拥有delegate属性的控件,才有这个功能 NSTimer的使用 开启定时器 @property (nonatomic, weak...) NSTimer *timer; // 返回一个自动开始执行任务的定时器 self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target
,即滑动UIScrollView时才会执行的模式,此时,不在该模式内的Source/Timer/Observer都不会得到执行,它仅仅专注于滑动时产生的各种事件,通过这样的方式就可以保证用户在滑动页面时的流畅性..., World222"); }]; } 上面的栗子创建了两个NSTimer,这两个定时器执行效果相同,但如果页面中有一个UIScrollView或其子类的对象在滑动时,NSTimer就不会再有任何输出...,当停下滑动时又会有输出,因为上述代码创建的两个NSTimer都加入到了RunLoop对象的NSDefaultRunLoopMode中,在滑动时RunLoop会切换到UITrackingRunLoopMode...如果加在其他模式下,当模式切换时就不会再执行NSTimer的回调方法了,所以,在使用时需要根据情况选择不同的定时器以满足项目需求。...执行source0事件 如果有source1(基于端口的)事件则立即执行跳转到第九步 通知监听器RunLoop即将进入休眠状态 将线程休眠,直到以下事件发生才会被唤醒: 有source1事件到达
2.3 CFRunLoopTimerRef CFRunLoopTimerRef是定时源(RunLoop模型图中提到过),理解为基于时间的触发器,基本上就是NSTimer(哈哈,这个理解就简单了吧)。...但是当我们拖动Text View滚动时,我们发现:run方法不打印了,也就是说NSTimer不工作了。而当我们松开鼠标的时候,NSTimer就又开始正常工作了。...通知观察者即将要开始的定时器 通知观察者任何即将启动的非基于端口的源 启动任何准备好的非基于端口的源 如果基于端口的源准备好并处于等待状态,立即启动;并进入步骤9 通知观察者线程进入休眠状态 将线程置于休眠知道任一下面的事件发生...4.2 ImageView推迟显示 有时候,我们会遇到这种情况: 当界面中含有UITableView,而且每个UITableViewCell里边都有图片。...监听UIScrollView的滚动 因为UITableView继承自UIScrollView,所以我们可以通过监听UIScrollView的滚动,实现UIScrollView相关delegate即可。
检测方法是用 Mark Generation 的方式,当每次点击 Mark Generation 时,Allocations 会生成当前 App 的内存快照,而且 Allocations 会记录从上回内存快照到这次内存快照这个时间段内...---- 3、Analyze 静态分析入口: 分析案例: 缺陷:只能检查编译时的内存泄漏,并不能检测到所有的内存泄漏,如:发生在运行时,或需要用户操作时产生的泄露。...---- 8、FBRetainCycleDetector Facebook 开源的 循环引用检测 工具 FBRetainCycleDetector 当确认或怀疑一个对象是否泄露时,都可以使用该工具查找循环引用链...= nil; } iOS10之前的方法,需要传入target(一般我们用self)作为代理,执行需要定时触发的方法。...当开发者直接传入 self 时,就导致了 self 无法被释放,进而在 dealloc 里释放 NSTimer 的代码也不会执行,从而导致了内存泄露:RunLoop -> NSTimer -> self
基于 「CADisplayLink」 触发的动画,和基于 NSTimer 触发类似,只不过这个 timer 源是和渲染保持一致的,能够做到更流畅更贴合。...整体过程大概如下: 1)App 处理事件,例如 touch 事件或者 displaylink timer 事件; 2)App 完成视图的 layout、图像 decode 等操作,并触发 CA::Transaction...它在 iOS 6 中引入,旨在减轻 Springboard 的一些职责,主要是事件处理的职责。它主要负责把 touch 事件分发到 app 进程以及处理 app 进程触发的动画和UI更新操作。...,这就回导致 FPS 发生变化,也最终影响了 app 的性能占用。...但是在我们直播场景中,一共有如下几种场景的动画提交: 1)UIView block 动画; 2)UIScrollView scroll 动画; 3)NSTimer 动画; 4)CAAnimation。
自欺欺人的使用 NSTimer 销毁 Demo地址 1.NSTimer是要加到runloop中才会起作用。...:@selector(timerAction:) userInfo:nil repeats:YES]; 第一种缺陷如果当前线程就是主线程,也就是UI线程时,某些UI事件,比如UIScrollView的拖动操作...,会将Run Loop切换成NSEventTrackingRunLoopMode模式,在这个过程中,默认的NSDefaultRunLoopMode模式中注册的事件是不会被执行的。...自欺欺人的写法,永远都不会执行到,除非你在外部手动invalidate这个timer [self.timer invalidate]; } 当我们在控制器中创建timer且tager设为self时。...会发生 timer 添加到 Runloop 的时候,且会被 Runloop 强引用, Note in particular that run loops maintain strong references
kCFRunLoopDefaultMode) • NSRunLoopCommonModes(kCFRunLoopCommonModes) CFRunLoopTimerRef CFRunLoopTimerRef是基于时间的触发器...NSRunLoop *runloop = [NSRunLoop currentRunLoop]; autorelease 对象在什么情况下会被释放?...但是非主线程通常来说就是为了执行某一任务的,执行完毕就需要归还资源,因此默认是不运行RunLoop的。NSRunLoop提供了一个添加NSTimer的方法,这个方法是在应用正常状态下会回调。...为什么 UIScrollView 的滚动会导致 NSTimer 失效?...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
RunLoop 的销毁发生在线程结束时。 六....和UITrackingRunLoopMode用,并不是一种真正的Mode Mode间的切换 我们平时在开发中一定遇到过,当我们使用NSTimer每一段时间执行一些事情时滑动UIScrollView,NSTimer...CFRunLoopSourceRef事件源(输入源) Source分为两种 Source0:非基于Port的 用于用户主动触发的事件(点击button 或点击屏幕) Source1:基于Port的...RunLoop内部有一个自动释放池,当RunLoop开启时,就会自动创建一个自动释放池,当RunLoop在休息之前会释放掉自动释放池的东西,然后重新创建一个新的空的自动释放池,当RunLoop被唤醒重新开始跑圈时...,Timer,Source等新的事件就会放到新的自动释放池中,当RunLoop退出的时候也会被释放。
(NSTimer不是“Input”,触发时不会导致run循环返回) 2、Modes RunLoop会在不同的时候被设置为不同的Mode 1)common:modes的组合,可以将source、timers...(例如拖拽、滑动事件) 4)modalPanel:当等待模式面板的输入时(如NSSavePanel或NSOpenPanel) 5)tracking:在跟踪控制时 3、item事件 RunLoop -...一个回调,不能主动触发事件。...加入RunLoop时会注册对应的时间点,到时会被唤醒处理回调 3、Observer: 观察者,包含一个回调。当RunLoop状态发生变化时,会触发回调。...7、使用 1)解决NSTimer在ScrollView滑动时不work [runLoop addTimer :timer forMode : NSDefaultRunLoopCommonMode
然而你只生成一个实例你的事件是不会被触发的,这是因为你没有把他加入到runloop当中。...当设置tolerance之后在允许范围内的延迟可以触发事件,超过的则不触发。...顺便提一句,如果生成timer实例的时候repeat为NO,那当触发事件结束后,系统也会自动调用invalid一次。 关于runloop 有时我们将timer添加到runloop中,而依旧不触发事件。...例如,当手指按住UITableView拖动时就会处于此模式。...当scrollView发生滚动时,当前runloop会切换为UITrackingRunLoopMode。
程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决? Runloop 是怎么响应用户操作的, 具体流程是什么样的? 说说RunLoop的几种状态?...当线程结束时,RunLoop会被销毁。 六....,触摸事件确实是会触发Source0事件。...和UITrackingRunLoopMode用,并不是一种真正的Mode Mode间的切换 我们平时在开发中一定遇到过,当我们使用NSTimer每一段时间执行一些事情时滑动UIScrollView,NSTimer...,Timer,Source等新的事件就会放到新的自动释放池中,当RunLoop退出的时候也会被释放。
当事件源发生时RunLoop会唤醒线程来处理事件。 - 如果把一般线程的执行看作是一条直线,有起点终点, 而runloop就是把这个线连接成圆圈,一直在跑圈,除非切断否则一直线程一直在运行。...节省CPU资源,提高程序性能:该做事时做事,该休息时休息 RunLoop什么情况下使用 - 线程中使用ports 或 input sources 和其他线程通信 - 在线程中使用timers // 如果不启动...在你运行一个Run Loop时,你会为它显示或隐式地指定一个mode 这之后,在这个Run Loop中,只有与这个mode关联的事件源才会被监听并被允许分发事件,同理,也只有与这个mode关联的observer...timer sources:用于分发同步事件,通常这些事件发生在特定时间或者重复的时间间隔上,比如:[NSTimer scheduledTimerWithTimeInterval:target:selector...Corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。
领取专属 10元无门槛券
手把手带您无忧上云