2、渲染时间 在UIViewController的生命周期中,Viewdidload和Viewdidappear之间的时间可以认为是“UI渲染时间”,我们可以通过统计二者之间的时间差距来统计页面的渲染时间...对应的返回上一个界面的方式是pop和dismiss,一般在pop或者dismiss方法调用之后,随后就会调用dealloc方法,将UIViewController内存情况,内存得到释放,如果无法调用dealloc...:), @selector(ht_viewWillAppear:)); monitor_exchangeInstanceMethod([self class], @selector(viewDidAppear...注意从下一个界面返回这个界面时也会调用viewdidappear,需要避免这个统计。...四、内存泄漏 因为UIViewController得不到释放而造成内存泄漏的情景有三种 NSTimer NSTimer:一方面,NSTimer经常会被作为某个类的成员变量,而NSTimer初始化时要指定
合创建一些附加的view和控件 3、ViewWillAppear 在视图加载完成,并即将显示在屏幕上时,会调用viewWillAppear方法,在这个方法里,可以改变当前屏幕方向或状态栏的风格等。...4、viewWillLayoutSubviews 即将开始子视图位置布局 5、ViewDidLayoutSubviews 用于通知视图的位置布局已经完成 6、ViewDidAppear 当viewWillAppear...方法执行完后,系统会执行viewDidAppear方法。...都会被调用,而第二次(viewA已经有了viewB)只调用viewB的 view的Frame变化会触发layoutSubviews 滚动一个UIScrollView会触发layoutSubviews 旋转...,可以简单理解为显示在最前面的window为keywindow) Push到下一层的顺序 viewWillDisappear->viewWillAppear->viewDidDisappear->viewDidAppear
. // import UIKit class ViewController: UIViewController { override func loadView() {...viewDidLoad() { super.viewDidLoad() print("viewDidLoad") } override func viewWillAppear...(_ animated: Bool) { super.viewWillAppear(animated) print("viewWillAppear") }...override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print...updateViewConstraints viewWillLayoutSubviews viewDidLayoutSubviews viewDidAppear 分析 ---- 直接修改Frame viewDidAppear
320.000000 h:568.000000 //viewDidAppear w:414.000000 h:672.000000 有没有发现在viewWillAppear、viewDidAppear...的时候也有这种问题,如果在init中添加控件的话,那么self.frame.size.width也不一定是准确的宽度,一般解决方法是使用[UIScreen mainScreen].bounds.size.width而不是...iOS7新增加了导航控制器侧滑手势,当触发侧滑返回时,会调用系统的viewWillDisappear:方法,取消侧滑返回时又会调用viewWillAppear:方法。...Default does nothing 对象的视图已经消失、被覆盖或是隐藏时调用. UIViewController类提供一些方法,用来判断为什么view外观发生更改。...ViewWillAppear:view将要显示 ViewWillLayoutSubViews:view将要布局子控件 ViewDidLayoutSubViews:view布局子控件完成 ViewDidAppear
当我们创建一个UIViewController类的对象时,通常系统会生成几个默认的方法,这些方法大多与视图的调用有关,但是在视图调用时,这些方法的调用顺序如何,需要整理下。...通常上述方法包括如下几种,这些方法都是UIViewController类的方法: - (void)viewDidLoad; - (void)viewDidUnload; - (void)viewWillAppear...这个方法通常并不会在视图变换的时候被调用,而只会在系统退出或者收到内存警告的时候才会被调用。 但是由于我们需要保证在收到内存警告的时候能够对其作出反应,所以这个方法通常我们都需要去实现。...3)- (void)viewWillAppear:(BOOL)animated; 系统在载入所有数据后,将会在屏幕上显示视图,这时会先调用这个方法。...上述方法的流程图可以简单用如下表示: 运行APP —> 载入视图 —> 调用viewDidLoad方法 —> 调用viewWillAppear方法 —> 调用viewDidAppear方法 —> 正常运行
增加了新的生命周期函数viewIsAppearing(),调用时机介于viewWillAppear()与viewDidAppear()之间,并且兼容到 iOS 13。...案例 import UIKit class ViewController: UIViewController { // UIContentUnavailableConfiguration...super.viewDidLoad() print(#function) } // MARK: view即将显示 override func viewWillAppear...(_ animated: Bool) { super.viewWillAppear(animated) print(#function) } // MARK...(_ animated: Bool) { super.viewDidAppear(animated) print(#function) } // MARK
继承是另一种可行的方式,但是这要求所有被继承的视图控制器如 UIViewController, UITableViewController, UINavigationController 都在 viewDidAppear...现在,UIViewController 或其子类的实例对象在调用 viewWillAppear: 的时候会有 log 的输出。...在交换了方法的实现后,xxx_viewWillAppear:方法的实现已经被替换为了 UIViewController -viewWillAppear:的原生实现,所以这里并不是在递归调用。...由于 xxx_viewWillAppear: 这个方法的实现已经被替换为了 viewWillAppear: 的实现,所以,当我们在这个方法中再调用 viewWillAppear: 时便会造成递归循环。...理解实现原理:只是简单的拷贝粘贴交换方法实现的代码而不去理解实现原理不仅会让 App 很脆弱,并且浪费了学习 Objective-C 运行时的机会。
简单的分类,添加类方法或者示例方法 -- 将统计逻辑封装在分类方法里面,在需要统计的地方导入并调用分类方法。...- 1.自定义实现方法 + (void)load{ swizzleMethod([self class], @selector(viewDidAppear:), @selector(swizzled_viewDidAppear...AspectOptionAutomaticRemoval = 1 << 3 /// 在执行1次后自动移除 }; 调用示例代码: [UIViewController aspect_hookSelector...的viewWillAppear:挂钩一个Block,在原始方法执行完成后,打印字符串。...事件 [UIViewController aspect_hookSelector:@selector(viewDidAppear:)
页面生命周期 viewDidLoad: 载入完成,可以进行自定义数据以及动态创建其他控件 viewWillAppear: 视图即将出现在屏幕之前 viewDidAppear: 视图已经在屏幕上渲染完成...:(BOOL)animated{ [super viewDidAppear:animated]; //继承了UIViewController的viewDidAppear方法...的viewDidAppear方法 */ [UIViewController aspect_hookSelector:@selector(viewDidAppear:) withOptions...:AspectPositionAfter usingBlock:^(id aspectInfo){ NSLog(@"%@ 对象的viewDidAppear调用了"...对我而言有两点思考. 1、专项测试测出来的数据结果,其实并不是记录一个数值而已,更需求了解其背后的技术特性。
交换两个方法的实现一般写在分类的load方法里面,因为load方法会在程序运行前加载一次,而initialize方法会在类或者子类在 第一次使用的时候调用,当有分类的时候会调用多次。...但是会引发一个新的问题:前一个页面的viewWillAppear:、viewDidAppear:也无法触发。...例如:A Present B, 有时因为业务逻辑需要,必须在viewWillAppear, viewDidAppear里写一些代码,当B 调用dismiss方法的时候, A的这个两个方法不会触发,...因此如果要求B 调用dismiss方法,A要执行viewWillAppear:、viewDidAppear:这个两个方法,这个时候要把B的modalPresentationStyle设置为:UIModalPresentationFullScreen...; // 3、 其他:如果要求 B既要半透明,dismiss时,A还要调用viewWillAppear:、
loadView方法 作用:loadView方法是用来负责创建UIViewController的view。...什么时候调用:每次访问UIViewController的view,当view为nil,就会调用loadView方法。...什么时候调用:每当view创建完毕的时候,最终都会调用viewDidLoad方法。 其次,在view创建过程中还有一些需要注意的地方。...的生命周期 控制器View的生命周期方法 loadView: 加载view viewDidLoad: view加载完毕 viewWillAppear...viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -
增加了 UIContentUnavailableView,UIView 与 UIViewController 都可以设置数据为空时的占位视图。 推出新的数据持久化框架 SwiftData。...UIViewController 增加了新的生命周期函数viewIsAppearing(),调用时机介于viewWillAppear()与viewDidAppear()之间,并且兼容到 iOS 13。...UIViewController 增加了新的属性contentUnavailableConfiguration,用于设置view内容不可达时的占位内容。 弹簧动画增加了新的专属 API。
class subViewController: UIViewController { //nib文件的初始化 override init(nibName nibNameOrNil...UIColor.red // Do any additional setup after loading the view. } //vc即将出现 override func viewWillAppear...(_ animated: Bool) { super.viewWillAppear(animated) print(#function) }...super.viewWillLayoutSubviews() print(#function) } //布局更新完成 //layoutIfNeeded调用更新后会也会调用...super.viewDidLayoutSubviews() print(#function) } //页面已经出现 override func viewDidAppear
则UIViewController调用loadView方法。...4》UIViewController调用viewDidLoad来运行一些载入时任务。 卸载循环 1》 程序收到内存警告。...2》每一个UIViewController调用didReceiveMemoryWarning。默认会安全地释放掉view。...3》假设UIViewController释放掉了它的view,它会调用viewDidUnload。 能够重载这种方法来进行额外的清理工作。...除非你没有使用xib文件创建视图 4、viewDidLoad 加载完毕,能够进行自己定义数据以及动态创建其它控件 5、viewWillAppear
其它三个都是通过对应的控制器类来完成工作,而不是直接构建和管理视图。 ...设置导航栏的按钮并不是去设置导航栏本身。一切都是在被推入的UIViewController子类内部执行推入请求和相关导航栏的定制(如:右键按钮)。...注意:对于导航栏定制,对定制实际标题的最简单方式时使用子视图控制器而不是导航项的title属性: C代码 self.title = @"Hello"; self.title = [[[NSBundle...• – viewWillAppear: • – viewDidAppear: • – viewWillDisappear: • – viewDidDisappear: • – shouldAutorotateToInterfaceOrientation...接着会调用视图的viewLoad->viewWillAppear->viewDidAppear. 6. 控制器视图消失过程 消失过程比较简单,不作说明。 7.
而事件的标识与参数信息都写在配置表中,通过动态下发配置表来实现埋点统计。 无埋点 无埋点并不是不需要埋点,更准确的说应该是“全埋”, 前端的任意一个事件都被绑定一个标识,所有的事件都别记录下来。...很容易想到的就是使用目标 view到根之间的每个节点的深度(层次)组成一个路径,而节点的深度(层次)是指此节点在父节点中的 index。...埋点数据的数据又分为两种类型: 固定数据与可变的业务数据, 而固定数据我们可以直接写到配置表中, 通过唯一标识来获取。...对于 UIViewController,hook 下 ViewDidAppear: 这个方法知道哪个页面显示了就足够了。...这样每个 UIViewController 生命周期到了 ViewWillAppear 都会执行埋点的方法。
,执行关键数据初始化操作,非StoryBoard创建UIViewController都会调用这个方法。...loadView方法在UIViewController对象的view被访问且为空的时候调用。这是它与awakeFromNib方法的一个区别。...loadView方法不应该直接被调用,而是由系统调用,它会加载或创建一个view并把它赋值给UIViewController的view属性。...viewWillAppear 系统在载入所有的数据后,将会在屏幕上显示视图,这时会先调用这个方法,通常我们会在这个方法对即将显示的视图做进一步的设置。...viewDidAppear 在view被添加到视图层级中以及多视图,上下级视图切换时调用这个方法,在这里可以对正在显示的视图做进一步的设置。
而 UINavigationBar 样式的数据就存储在 UIViewController 的 UINavigationItem 中。...试想一下,当我们的页面会跳到不同的地方时,我们是不是要在 viewWillAppear: 和 viewWillDisappear: 方法里面写上一堆的判断呢?...等到页面 B 调用 viewDidAppear: 的时候,转场库会将假的导航栏样式设置到真的导航栏中,并将假的导航栏从视图层级中移除,最终将真的导航栏显示出来。...等到页面 A 调用 viewDidAppear: 的时候,转场库会将假的导航栏样式设置到真的导航栏中,并将假的导航栏从视图层级中移除,最终将真的导航栏显示出来。...使用 setNavigationBarHidden:animated: 方法,而不是 setNavigationBarHidden:。
:(BOOL)animated{ [super viewDidAppear:animated]; NSLog(@"viewDidAppear_ExchangeMethod1"); }...:(BOOL)animated{ [super viewDidAppear:animated]; NSLog(@"viewDidAppear_ExchangeMethod2"); }...控制台日志: RuntimeViewController2 viewDidAppear_ExchangeMethod2 此日志说明category的方法会覆盖宿主类的方法,而多个category...指向的方法 第二步第一次交换 3与2交换,相当于是与1交换,即1指向了3 第二步交换完成 执行的顺序:3->2->1 1.首先调用的是类...(1)中的方法,相当于调用了3 2.3调了本身方法,即调用了2方法 3.2再调了本身方法,即调了1方法 4.最后打印1中的日志 理解了1,2,3的顺序,对号入座即可。
如果我们想要交换两个方法的实现,从而实现调用 - (void)originalFunction; 方法实际上调用的是 - (void)swizzledFunction; 方法,而调用 - (void)swizzledFunction...这些注意事项并不是为了吓退初学者,而是为了更好的使用 Method Swizzling 这一利器。而至于方案的选择,无论是选择哪种方案,我认为只有最适合项目的方案才是最佳方案。 ---- 3....但是这样的话,所有继承自 UIViewController 类自身的 viewWillAppear: 就失效了,不会被调用。 这就需要用 Method Swizzling 来实现了。...步骤如下: 在分类中实现一个自定义的xxx_viewWillAppear: 方法; 利用 Method Swizzling 将 viewDidAppear: 和自定义的 xxx_viewWillAppear...然后在 xxx_viewWillAppear: 中添加统计代码和调用xxx_viewWillAppear:实现; 因为两个方法发生了交换,所以最后实质是调用了 viewWillAppear: 方法。
领取专属 10元无门槛券
手把手带您无忧上云