首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS 无侵入埋点组件总结

2.3.1 唯一标识(viewPath)的获取: 整个 APP 的视图结构可以看成是一颗树(viewTree),树的根节点就是 UIWindow,树的枝干由 UIViewController 及 UIView...另外,由于在做 view 的统计分析时,都是以页面为单位的,因此 SDK 在生成 viewPath 时,只到 view 所在的 UIViewController 级别,而非根部的 UIWindow。...对于 UIViewController,hook 下 ViewDidAppear: 这个方法知道哪个页面显示了就足够了。...对于手势,我们在创建的时候进行 hook,方法为 initWithTarget:action:。 3.3.3 实现原理 用运行时方法替换方法实现无侵入的埋点方法。 实现原理图: ?...具体实现方法: 创建一个运行时方法替换类 HGMethodSwizzingTool,实现替换的方法 `swizzingForClass: originalSel: swizzingSel:`` #import

3K31

Cocoa编程中视图控制器与视图类详解

iPhone编程规则是:一个窗口,多个视图。UIView是iPhone屏幕上很多控件的基础类。...进度与活动: UIActivityIndicatorView UIProgressView  控制器类 UIViewController类       UIViewController负责创建其管理的视图及在低内存的时候将它们从内存中移除...还为标准的系统行为进行响应。从语法上 说,UIViewController是视图控制器的父类。视图控制器类是没有可视化表示的抽象类,只有它管理的视图才提供可视画布。记住:1....视窗UIWindow虽然也是UIView,但不能用处理普通UIView的方式来设置; 2....选项卡类的方便之处就是不需要象导航栏那样以栈的方式推入和弹出视图的操作,而是组建一系列的控制器(它们各自可以是UIViewController、UINavigationController、UITableViewController

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

    UIViewController生命周期

    一、视图控制器 UIViewController采用懒加载的方式,也就是说第一次访问到view属性时才会加载或创建它。...但总的实现原理非常类似 通过这种方式加载视图,需要调用UIViewController类的initWithNibName:bundle:方法 通过loadview方法加载: 这就是通过代码加载...这需要我们在loadView 方法中,通过编程创建自己的视图层次,并且把把根视图赋值给UIViewController的view属性。...Screen会触发父UIView上的layoutSubviews 改变transform属性时,当然frame也会变 处于key window的UIView才会调用(程序同一时间只有一个window为keyWindow...从继承关系来看,UIWindow继承自UIView,所以UIWindow除了具有UIView的所有功能之外,还增加了一些特有的属性和方法,而我们最常用的方法,就是在App刚启动时,调用UIWindow的

    2K10

    六天完成一个简单iOS App - 第一天

    UITabBar 中间添加按钮的实现 我们知道中间加号按钮是没有标题的,即使我们将标题设置为空,还有有标题的label站位,所以UITabBarItem是不能实现了,那么我们只能将一个button覆盖在中间这块区域上...实现UINavigationController 返回按钮统一设置 方法一:创建基类,其他继承基类,自动有这个按钮类型 创建一个UINavigationController基类,设置好统一的返回按钮,...注意:NavigationController的根控制器也是push进来的,所以需要判断是否是根控制器 -(void)pushViewController:(UIViewController *)viewController...关于frame的分类 当我们在设置控件的宽高以及位置的时候需要设置self.frame.size.height;代码很长,那么我们可以写一个UIView的分类,直接就可以通过self.height来设置其高度...我是xx_cc,一只长大很久但还没有二够的家伙。

    1.1K50

    JSPatch 实现原理详解

    突然脑洞开了下,CoffieScript/JSX 都可以用 JS 实现一个解释器实现自己的语法,我也可以通过类似的方式做到,再进一步想到其实我想要的效果很简单,就是调用一个不存在方法时,能转发到一个指定函数去执行...通过 Selector 调用方法时,会从 methodList 链表里找到对应Method进行调用,这个 methodList 上的的元素是可以动态替换的,可以把某个 Selector 对应的函数指针IMP...替换成新的,也可以拿到已有的某个 Selector 对应的函数指针IMP,让另一个 Selector 跟它对应,Runtime 提供了一些接口做这些事,以替换 UIViewController 的 -viewDidLoad...具体实现,以替换 UIViewController 的 -viewWillAppear: 方法为例: 把UIViewController的 -viewWillAppear: 方法通过 class_replaceMethod...4.新增方法 i.方案 在 JSPatch 刚开源时,是不支持为一个类新增方法的,因为觉得能替换原生方法就够了,新的方法纯粹添加在 JS 对象上,只在 JS 端跑就行了。

    3.6K80

    UI篇-UIResponder之事件传递和响应精析

    UIResponder是所有响应者对象的基类,它不仅为事件处理,而且也为常见的响应者行为定义编程接口。...UIApplication、UIView、和所有从UIView派生出来的UIKit类(包括UIWindow)都直接或间接地继承自UIResponder类。...响应者链:由一系列“下一个响应者”组成 其顺序如下: 1.iOS系统在处理事件时,通过UIApplication对象和每个UIWindow对象的sendEvent:方法将事件以消息的形式分发给具体处理此事件的第一响应者...UIViewController的nextResponder属性为其管理view的superview....因此我们自建一个UITableViewCell类,并声明inputAccessoryView和inputView为readwrite的,并且重写它们的get方法,这样在某个tableviewcell变成第一响应者时

    2.5K30

    iOS的MVC框架之控制层的构建(上)

    MVC本身的框架思想非常的优秀,当出现问题时首先要考虑的并不是去替换掉现有的框架而是从设计的角度去优化现有的代码以及逻辑,让整个系统达到一个最优的组合。 1....等控制器之上进行派生类的构建,也就是实现某个具体功能的控制器不要从系统的控制器之上派生而应该从派生的控制器基类之上再派生出来。...除了用运算时扩展属性的方法外,还可以将共有的方法和属性单独提炼出来让一个辅助类来实现,然后在派生基类的初始化方法中创建这个辅助类,并且后续的一些方法都委托给辅助类来实现。...)这样当控制器中的根视图被销毁时,根视图里面的子视图也应该被销毁,而如果你用strong来定义子视图时就有可能导致子视图的生命周期要长于根视图。...我个人比较喜欢以handle开头。

    1.6K20

    【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    控制器 : 一般是 Objective - C 类, 一般都会继承 UIViewController 基类; 4....是该 UIControl 基类提供的; -- 添加事件响应方法 : "addTarget : action : forControlEvents :" , 为当前控件的 指定事件 设置 处理方法; -...自定义 UI 控件 (1) 自定义组件简介 自定义组件简介 :  -- UIView 基类 : 所有的 UI 控件都继承了 UIView 基类, UI 组件在 UIView 提供的空白区域上绘制具体的细节...; -- 适用情况 : 在 IOS 系统提供的组件不满足需求时, 就需要自定义组件; (2) UIView 基类常用方法 UIView 基类常用方法简介 :  -- "initWithFrame :"...: 点击 界面设计文件中的 UIView 根控件, 使用 command + option + 3 打开身份检查器, 由身份检查器上可以看到 其 Custom Class 属性为 UIView, 因此该界面的根控件时

    5K30

    MJRefresh源码剖析与学习

    self.window为空的时候,突然刷新崩溃(从另一个页面返回的时候),所以需要一个状态来过渡。...设置state会调用setNeedsLayout方法;如果self.window为空,把状态改成即将刷新,并调用setNeedsDisplay 首先UIView的setNeedsDisplay...,等基类的state赋值给oldState,再跟新状态对比,对比完后,再[super setState:state]调用基类,从而赋值基类state 该方法主要要注意状态在普通闲置状态以及刷新状态的...image 由此看来,这两种形式的header都有相同的共性,我们在做类似的功能时,如果有几个控件或者几个类共性一样,比如说,一个保险类(InsuranceClass),一个房地产类(RealEstateClass...),他们可以有一个基类销售类(SalesClass),SalesClass拥有销售员工、顾客、金额、销售日期等 保险类 和 房地产类 需要的共同属性 四、MJRefreshNormalHeader

    1.6K51

    【YFMemoryLeakDetector】人人都能理解的 iOS 内存泄露检测工具类

    我真的就是在“创建”时把数据记录到一个字典里,在“释放”时,从字典里移出对象;所谓的检测,其实就是打印那个字典,仍然在字典中的很有可能就是泄露喽。 当然,还是有一些技术细节的。...核心技术分析 AOP 机制,借助 Aspects 库实现 Aspects 这个库的基本用法,我专门说过,大家可以参考 Aspects– iOS的AOP面向切面编程的库。...直到现在,我依然以为,没有调用过这两个方法的视图或控制器对象,本身没有多大的拦截价值。当然,这依然因项目而异。作为一个工具类,只要它能解决大多数场景下的问题,我觉得就可以了。...以指针地址为key,以对象字符串为值.所以不用担心因为记录本身而引起的内存泄露问题....以指针地址为key,以对象字符串为值.所以不用担心因为记录本身而引起的内存泄露问题.

    1.3K60

    iOS 开发:『Runtime』详解(二)Method Swizzling

    交换了方法实现并且一些回调方法不会调用原生方法的实现这可能会造成底层实现的崩溃。 避免命名冲突和参数 _cmd 被篡改。 避免命名冲突一个比较好的做法是为替换的方法加个前缀以区别原生方法。...如果 + load 方法调用顺序为:父类 -> 子类 -> 父类类别 -> 子类类别,那么造成的影响就是调用子类的替换方法并不能正确调起父类分类的替换方法。...第二种:利用继承 创建基类,所有页面都继承自基类。这样的话只需要在基类的 viewDidAppear: 中添加一次统计功能。...但就是工作量很大,需要在所有有按钮的地方添加代码。很不想承认:在之前项目中,我使用的就是这种方式。...当返回数据,刷新 TableView、CollectionView 时候,进行判断,如果数据为空,则加载占位图。如果数据不为空,则移除占位图,显示数据。

    2K31

    iOS 常用设计模式汇总

    UIView及其子类主要负责UI的实现,而UIView所产生的事件都可以采用委托的方式,交给UIViewController实现。...3.1应用场景 一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。...5.5注意事项 1、剥离类中易于变化的行为,通过组合的方式嵌入抽象基类 2、变化的行为抽象基类为,所有可变变化的父类 3、用户类的最终实例,通过注入行为实例的方式,设定易变行为 防止了继承行为方式,导致无关行为污染子类...6.1应用场景 工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。 6.2优势 易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。...6.3敏捷原则 DIP依赖倒置原则 6.4实例 项目部署环境中依赖多个不同类型的数据库时,需要使用工厂配合proxy完成易用性替换 6.5注意事项 项目初期,软件结构和需求都没有稳定下来时,不建议使用此模式

    1.8K10

    iOS-UIWindow详解

    那么UIWindow是如何将View显示到屏幕上的呢 这里有三个重要的对象UIScreen,UIWindow,UIView。...UIScreen对象识别物理屏幕连接到设备 UIWindow对象提供绘画支持给屏幕 UIView执行绘画,当窗口要显示内容的时候,UIView绘画出他们的内容并附加到窗口上。...我们可以发现,当我们新建一个项目,直接在stroyboard为view设置一个背景颜色,然后运行项目,就能看到换了背景颜色的view,这说明系统已经帮我们创建了一个UIWindow,那么这个UIWindow...首先根据系统加载storyboard时做的三件事情,我们可以总结出UIWindow创建步骤 创建窗口对象 创建窗口的根控制器,并且赋值 显示窗口 并且我们在AppDelegate.h中发现属性window...我们来看一下[self.window makeKeyAndVisible];的底层实现了哪些功能 可以显示窗口 成为应用程序的主窗口 当我们不调用这个方法,打印self.window。

    2K40

    iOS 面向协议方式封装空白页功能

    嘿嘿,这个可以有,那我们接下来就来试试怎么通过协议的方式来避免上述情况,并且实现一行代码添加空白页功能 前言 如果对面向协议有疑问的同学可以看下我之前的两篇文章 iOS - Swift 面向协议编程...一、基本实现 1、创建协议 // MARK:- 空视图占位协议 public protocol LXFEmptyDataSetable { } 2、确定面向类 确定我们面向的类,一般tableView...或者collectionView都是写在控制器里,那我们面向的类就规定为UIViewController,或许也有人写在UIView里,不过这里先按UIViewController来写吧 // MARK...要明白这里的self指的是UIViewController,考虑到UIView的可能,这里我就让万物对象之父NSObject来遵守,并实现对应的数据源方法和代理方法 extension NSObject...可以使用Cocoapods的方式来安装使用 pod 'LXFProtocolTool' 我也将 iOS - Swift 面向协议编程(二) 中提及的通过协议便捷加载xib的功能也集成了进来。

    1.5K50

    唯一可行的 iOS 架构

    当ViewModel 也变得像 Controller 一样臃肿时,我该怎么办?社区也因此分裂为喜欢 MVVM 的人和不喜欢 MVVM 的人。 MVP 解决此问题的另一种尝试是 MVP。...这是我们如何处理用户交互的一种方式,而诸如 Interactor 或 Presenter 之类的其他类则不会更改这种方式。相反,MVC 在必要时根据问题涉及其他实体。...每个 UIViewController 都拥有一个根 UIView。我们可以在 interface builder 中绘制视图而无需任何代码,并将所有用户操作链接到UIViewController。...它甚至都不是 OOP,我认为这是具有 5 个文件的过程编程。 我认为,VIPER 是一个很大的错误。VIPER 证明我们还不了解 MVC。我的建议是忘记 VIPER,不要讨论它。...如果在其他页面上以不同方式显示此信息(例如表情符号)怎么办? 现在,该再次重申 MVC 不是模式。是的,我们在 Presentation 层中有一些逻辑,MVC 不会强迫您在现有的类中编写此逻辑。

    1.3K20
    领券