首页
学习
活动
专区
圈层
工具
发布

Runtime运用:埋点统计

2、渲染时间 在UIViewController的生命周期中,Viewdidload和Viewdidappear之间的时间可以认为是“UI渲染时间”,我们可以通过统计二者之间的时间差距来统计页面的渲染时间...对应的返回上一个界面的方式是pop和dismiss,一般在pop或者dismiss方法调用之后,随后就会调用dealloc方法,将UIViewController内存情况,内存得到释放,如果无法调用dealloc...在load方法中,将UIViewController的生命周期里的几个method都通过method swizzling替换成我们自定义的方法,在自定义的方法中进行埋点,从而达到统计和监测的目的。...注意从下一个界面返回这个界面时也会调用viewdidappear,需要避免这个统计。...四、内存泄漏 因为UIViewController得不到释放而造成内存泄漏的情景有三种 NSTimer NSTimer:一方面,NSTimer经常会被作为某个类的成员变量,而NSTimer初始化时要指定

1.3K20

浅析 NSTimer 和 CADisplayLink 内存泄漏

以 UITableViewCell 为例: 一、在 Cell 中直接使用 NSTimer 首先我们按照常规做法,直接在 UITableView 的 Cell 上添加相应的 NSTimer, 并使用 scheduledTimer...所谓的内存泄露就是本应该释放的对象,在其生命周期结束之后依旧存在。...(image-d0e3cd-1528529178817)] 如图所示,在开发中,如果创建定时器只是简单的计时,不做其他引用,那么 timer 对象与 myClock 对象循环引用的问题就可以避免(即省略...虽然孤岛问题已经避免了,但还是存在问题,因为 myClock 对象被 UIViewController 以及 timer 引用(timer 直接被 NSRunLoop 强引用着),当 UIViewController...所以我们要做的是在向 myClock 对象发送 dealloc 消息前在给 timer 发送 invalidate 消息,从而避免本末倒置的问题。

1.9K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS 如何解决 NSTimer 循环引用

    前言 ---- 在使用 NSTimer,如果使用不得当特别会引起循环引用,造成内存泄露。所以怎么避免循环引用问题,下面我提出几种解决 NSTimer 的几种循环引用。 2....原因 ---- 当你在 ViewController (简称 VC )中使用 timer 属性,由于 VC 强引用 timer,timer 的target 又是 VC 造成循环引用。...,NSTimer 强引用 PFTimer,避免让NSTimer 强引用 ViewController,这样就不会引起循环引用,然后在 dealloc 方法中执行 NSTimer 的销毁,相对的 PFTimer...使用很简单,但是要注意两点: 避免 block 的循环引用,使用 __weak 和 __strong 来避免 在持用 NSTimer 对象的类的方法中 -(void)dealloc 调用 NSTimer...在传入参数时要通过 copy 方法,将 block 拷贝到"堆区",否则等到稍后要执行它的时候,该 blcok 可能已经无效了。

    1.8K30

    关于 循环引用问题

    Delegate 如果你知道Delegate为什么用weak修饰不用strong,也就明白了它为什么能造成循环引用,也能更好的避免发生此问题。...NSTimer 因为NSTimer 的 target 对传入的参数都是强引用,所以当类具有NSTimer类型的成员变量,并且需要反复执行计时任务时容易造成循环引用。...方法,放在viewDidDisappear中又限制太死,最好的方法为(NSTimer的类别): @interface NSTimer (EXBlock) + (NSTimer *)ex_scheduledTimeWithTimeInterval...原理:MLeaksFinder是从UIViewController入手的,UIViewController在POP或dismiss之后该控制器及其上的view,view的subviews都会被释放掉,MleaksFinder...内存泄漏提示 4.自定义检测工具 需求:检测UIViewController 是否发生内存泄漏。 思路:我们需要检测控制器对象在POP后是否还存活,存活则表示有内存泄漏。

    3.9K20

    object-c编程tips-timer「建议收藏」

    它保留的是类对象,因此也就不会有什么问题。 它传入要运行的block, 然后在回调函数中通过userInfo得到block,并运行。 改进: 这个已经是一个非常大的改进了。...当然能够在block中使用weak_self的方式避免循环引用,可是写起代码来总是有些不顺手。并且还必需要外部使用者显式的进行。 于是非常easy想到。应该封装到一个专门的LPTimer类中。...而NSTimer运行的block使用的是weak_self。 它在timer触发的时候调用自身的doTimer方法。在doTimer中负责将方法传递给外部的使用者。...外部的使用者能够将LPTimer看成是一个普通的对象即可,持有它也不会有什么问题。 LPTimer保留一个弱引用指向外部的使用者。在时间到timer触发的时候,会先调到NStimer的block中。...必须注意释放NStimer对象,在LPTimer释放的时候调用NSTimer的invalidate方法。

    50210

    系统框架--52:NSTimer会保留其目标对象

    NSTimer的循环引用 创建定时器时,Student引用了定时器,在给定时器添加任务时,定时器保留了目标对象self,这里就出现了循环引用 #import 的时候调用end方法。然而,合适的时机很难找到。假如这是一个验证码倒计时程序,你可以在倒计时结束时调用end方法。...但是你不能确定用户一定会等倒计时结束才返回到上一级页面.或许你想在dealloc方法中使定时器失效,那你就太天真了。此时定时器还保留着当前控制器,此方法是不可能调用的,因此会出现内存泄漏。...或许在倒计时程序中,你可以重写返回方法,先调用end再返回,但这不是一个好主意 这里采用block块的方法为NSTimer增加一个分类,具体细节看代码(程序员最好的语言是代码)。...iOS10中,定时器的API新增了block方法,实现原理和这一样,只不过我这里用的是分类,而系统是在原始类中直接添加方法,最终的行为是一致的 #import "Student.h" @implementation

    57010

    2018 - iOS 面试题汇总一般面试题BAT面试题

    weak 在 storyboard 中添加一个控件引用关系是这样的(以 UIbutton 为例): UIviewController -> UIview -> UIbutton 此时 UIviewController...) 添加到子控件也是强引用: UIbutton 就是添加到了 UIviewController 的 view 上 8 预处 指令define 声明 个常数, 以表明 中有多 少秒(忽 闰 问题...在 UIViewController 中重载 didReceiveMemoryWarning 方法。...为这种属性设置新值得时,设置方法既不保留新值,也不释放旧值。此特性同assign类似,然后在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 弱引用,不决定对象的存亡。...如果可以尽量使用HTTPS,可以有效的避免接口数据在传输中被攻击。 35.main()之前的过程有哪些 在iOS中 main.m 是我们所熟悉的程序入口。但是在在此之前其实程序以及做了很多事了。

    7K30

    iOS对UIViewController生命周期和属性方法的解析

    这篇博客,旨在讨论UIViewController的生命周期和属性方法,在最基础的东西上,往往会得到意想不到的惊喜。...二、UIViewController的生命周期         要了解UIViewController,先要弄清楚其生命周期。...在面向对象的语言中,是对象,就一定要有生命周期,UIViewController也不例外,生命周期管理Controller的作用范围和时间,也管理其内对象的作用范围和时间。...1、parentViewController         UIViewController里面封装了一个数组,可以存放其子ViewController,系统中使用的例子就是导航和tabBar这类的控制器...,还有一个属性可以设置弹出的controler的填充效果,但是这个属性只在pad上有效,在iphone上无效,都是填充到整个屏幕: @property(nonatomic,assign) UIModalPresentationStyle

    3.7K20

    Objective-C对象引用

    一、引用 引用是iOS内存管理中的重要知识点,总所周知,iOS对象的内存管理是使用引用计数来表示的。一个对象只有在它的所有强引用都被释放后才能被回收。因此,一个对象的生命周期取决于其强引用的所有者。...在某些情况下,这种行为可能并不理想。您可能想要引用一个对象而不妨碍对象本身的回收。对于这种情况,您可以获取一个“弱”引用。弱引用是通过存储一个指向对象的指针创建的,而不是保留对象。...打破循环引用很简单,将其中一个指针改为弱引用 三、NSTimer引起的循环引用 @interface DetailViewController () @property (nonatomic, weak...) NSTimer *timer; @end @implementation DetailViewController - (IBAction)fireButtonPressed:(id)sender...就是我们在block中常用的那种。

    1.3K20

    定时器 你真的会使用吗?

    iOS10.0 推出了两个新的API,与上面的方法相比,selector换成Block回调以、减少传入的参数(那几个参数真是鸡肋)。不过开发中一般需要适配低版本,还是尽量使用上面的方法吧。...存在延迟 不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。...重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行,这个延迟时间大概为50-100毫秒....需要注意的是,该属性在`targe`t的`selector`被首次调用以后才会被赋值。...但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会 - **适合做界面渲染** CADisplayLink可以确保系统渲染每一帧的时候我们的方法都被调用,从而保证了动画的流畅性

    1.4K20

    iOS APP运行时Crash自动修复系统

    与此同时,如果NSTimer是无限重复的执行一个任务的话,也有可能导致target的selector一直被重复调用且处于无效状态,对app的CPU,内存等性能方面均是没有必要的浪费。...那么解决NSTimer的问题的关键点在于以下两点: NSTimer对其target是否可以不强引用 是否找到一个合适的时机,在确定NSTimer已经失效的情况下,让NSTimer自动invalidate...由上图流程可知,当NSTimer的回调函数fireProxyTimer:被执行的时候,会自动判断原target是否已经被释放,如果释放了,意味着NSTimer已经无效,此时如果还继续调用原有target...所以此时需要将NSTimer invalidate,然后统计上报错误数据。如此一来就做到了NSTimer在合适的时机自动invalidate。...同时还需要注意一点:因为zombie的机制需要在对象释放时保留其指针和相关内存占用,随着app的进行,越来越多的对象被创建和释放,这会导致内存占用越来越大,这样显然对于一个正常运行的app的性能有影响。

    3.8K1713

    【iOS开发】在 App 中加入 AdMob 广告 - 入门介绍与编程技巧

    ,可以上传身份证照片(我就是这样),然后Google会以极速(我当时是几个小时)通过这个请求。...这是地址 ---- 横幅式广告与插页式广告 开发者在App中加入广告时,要极力避免让用户感到非常厌烦。...,这段代码的意思是让 UITableView 的可滚动内容区域在底部收缩,收缩长度为banner广告条的高度。...如果你的 UITableView 是存在于 UITableViewController 中的,那么 UITableView 的 frame 是不可调节的,所以通过上面的代码,我们可以方便地避免广告遮挡原有的内容...而即便你的 UITableView 是存在于 UIViewController 中的,即这个 UITableView 是你自己添加进来的,你可以任意调节 frame,我依然建议你用上面这种方法,而不是直接把

    5.8K30

    打造自己的内存泄漏检测工具

    虽然 Xcode 的 Instrucment 提供了 Leaks 和 Allocations 工具让我们能精准地定位内存泄漏问题,但是这种方式相对比较繁琐,需要开发人员频繁地去操作应用界面,以触发泄漏场景...// 收集之后再统一处理,避免对每一个对象都进行 3s 检测 TDFLeakObjectProxyCollector *collector = [[TDFLeakObjectProxyCollector...,直接调用属性的 getter 方法获取属性值,可能会触发属性懒加载,导致出现意料之外的问题 (比如调用 UIViewController 的 view 会触发 viewDidLoad),所以要通过 object_getIvar...比如 NSTimer / CADisplayLink 对象的常见内存泄漏场景,除了 target 强引用控制器造成循环引用域外,还有一种是打破了循环引用但没有在控制器销毁时执行 invalidate 操作...,因为 NSTimer 由 RunLoop 持有,不手动停止的情况下,就会造成泄漏。

    1.4K30

    面试iOS 机会在自己手中

    在项目什么时候选择使用GCD,什么时候选择NSOperation 答: 项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation...的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。...项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。 3....对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度...方法: 1、在主线程中进行NSTimer操作,但是将NSTimer实例加到main runloop的特定mode(模式)中。

    82951

    《Effective Objective-C》干货三部曲(二):规范篇

    可以避免循环引用:因为如果两个类在自己的头文件中都引入了对方的头文件,那么就会导致其中一个类无法被正确编译。...而且要注意一下:如果替换式中存在运算符号,以笔者的经验最好用括号括起来,不然容易出现错误(有体会)。...第15条:用前缀 避免命名空间冲突 Apple宣称其保留使用所有"两字母前缀"的权利,所以我们选用的前缀应该是三个字母的。 而且,如果自己开发的程序使用到了第三方库,也应该加上前缀。...第52条: 别忘了NSTimer会保留其目标对象 在使用NSTimer的时候,NSTimer会生成指向其使用者的引用,而其使用者如果也引用了NSTimer,那么就会生成保留环。...像这种通过主动调用方法来打破保留环的设计显然是不好的。 而且,如果通过回收该类的方法来打破此保留环也是行不通的,因为会将该类和NSTimer孤立出来,形成“孤岛”: ?

    1.1K10

    《Effective Objective-C》干货三部曲(二):规范篇

    可以避免循环引用:因为如果两个类在自己的头文件中都引入了对方的头文件,那么就会导致其中一个类无法被正确编译。...而且要注意一下:如果替换式中存在运算符号,以笔者的经验最好用括号括起来,不然容易出现错误(有体会)。...第15条:用前缀 避免命名空间冲突 Apple宣称其保留使用所有"两字母前缀"的权利,所以我们选用的前缀应该是三个字母的。 而且,如果自己开发的程序使用到了第三方库,也应该加上前缀。...第52条: 别忘了NSTimer会保留其目标对象 在使用NSTimer的时候,NSTimer会生成指向其使用者的引用,而其使用者如果也引用了NSTimer,那么就会生成保留环。...而且,如果通过回收该类的方法来打破此保留环也是行不通的,因为会将该类和NSTimer孤立出来,形成“孤岛”: 孤立了类和它的NSTimer 这可能是一个极其危险的情况,因为NSTimer没有消失,它还有可能持续执行一些任务

    1.2K21
    领券