手动埋点、主动化埋点、可视化埋点

手动埋点、主动化埋点和可视化埋点是iOS运用中常用的数据搜集办法。它们各有特色和适用场景,下面我会对它们进行具体介绍。

手动埋点

手动埋点是指开发人员在代码中主动刺进埋点代码来搜集需求的数据。开发人员需求在触发事情的具体办法中增加代码来记载相关信息,并依据上报战略将数据上传到后台。手动埋点的长处是灵敏性高,能够依据具体需求自界说搜集的数据内容和上报办法。可是手动埋点也存在一些问题,比方新增埋点需求发版、埋点代码和事务代码耦合等[1]

主动化埋点

主动化埋点是经过主动化东西来完结数据搜集,无需手动刺进埋点代码。主动化埋点东西会主动监测运用的页面加载、点击等事情,并主动嵌入监测代码来搜集数据。主动化埋点的长处是削减了开发人员的工作量,无需手动刺进埋点代码。可是主动化埋点也存在一些问题,比方数据量巨大、数据清洗难度大等[1]

可视化埋点

可视化埋点是经过可视化东西来进行数据搜集装备。开发人员能够运用可视化东西圈选具体页面元素,并生成装备信息。在用户操作时,可视化埋点东西会依据装备判断是否需求搜集该事情。可视化埋点的长处是装备方便快捷,无需手动编写代码。可视化埋点也能够处理手动埋点中的一些问题,比方新增埋点不需求发版、降低了埋点代码和事务代码的耦合等。可是可视化埋点也需求处理一些问题,比方怎么确定页面元素的仅有标识、怎么携带事务参数等[1]

综上所述,手动埋点、主动化埋点和可视化埋点都是iOS运用中常用的数据搜集办法,它们各有优缺陷和适用场景。开发人员能够依据具体需求挑选适宜的埋点办法来进行数据搜集。


Learn more:

  1. iOS主动化埋点探究 – 简书
  2. 埋点治理:怎么把App埋点做到极致? –
  3. iOS可视化埋点规划计划 | 伴鱼技能团队

MVC、MVP、MVVM规划方式

在iOS开发中,常用的规划方式包括MVC(Model-View-Controller)、MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel)。这些规划方式都有各自的特色和适用场景。

  1. MVC(Model-View-Controller)
    MVC是苹果官方推荐的架构方式。它将运用程序分为三个首要部分:模型(Model)、视图(View)和操控器(Controller)。
  • 模型(Model):担任处理运用程序的数据逻辑,包括数据的获取、处理和存储。
  • 视图(View):担任展现数据给用户,并接纳用户的输入。
  • 操控器(Controller):作为模型和视图之间的中介,担任处理用户的输入、更新模型数据,并将更新后的数据展现在视图上。

MVC的长处是能够将运用程序的逻辑和界面别离,使代码愈加明晰和易于保护。但是,随着事务逻辑的增加,操控器或许会变得臃肿,导致保护成本增加[1]

  1. MVP(Model-View-Presenter)
    MVP是对MVC方式的一种演进版别。它将视图(View)和操控器(Controller)别离为视图(View)和展现器(Presenter)两个部分。
  • 模型(Model):同MVC方式中的模型,担任处理数据逻辑。
  • 视图(View):担任展现数据给用户,并接纳用户的输入。
  • 展现器(Presenter):作为模型和视图之间的中介,担任处理用户的输入、更新模型数据,并将更新后的数据展现在视图上。

MVP的长处是进一步解耦了视图和事务逻辑,使得视图能够独立于模型进行修正。同时,展现器能够单独测验事务逻辑,进步代码的可测验性[2]

  1. MVVM(Model-View-ViewModel)
    MVVM是由微软提出的一种架构方式。它将视图(View)和操控器(Controller)合并为视图(View)和视图模型(ViewModel)两个部分。
  • 模型(Model):同MVC和MVP方式中的模型,担任处理数据逻辑。
  • 视图(View):担任展现数据给用户,并接纳用户的输入。
  • 视图模型(ViewModel):作为模型和视图之间的中介,担任处理用户的输入、更新模型数据,并将更新后的数据展现在视图上。

MVVM的长处是能够将视图的状况和行为抽离出来构成一个新的笼统,使得事务逻辑和事务展现别离,进步代码的可保护性和重用性[1]

综上所述,MVC、MVP和MVVM都是常用的iOS规划方式,每种方式都有其适用的场景和优缺陷。挑选适宜的规划方式能够进步代码的可保护性和可测验性,使开发愈加高效。


Learn more:

  1. iOS 规划方式 浅析MVC、MVP、MVVM –
  2. [译]iOS架构方式–解密MVC、MVP、MVVM和VIPER –
  3. iOS 规划方式 浅析MVC、MVP、MVVM – 简书

常见的规划方式

在iOS开发中,常见的规划方式有以下几种:

  1. 单例方式:单例方式能够保证体系中一个类只要一个实例,常用于共享资源的场景。在iOS中,一些常见的单例目标包括UIApplication、NSNotificationCenter、NSFileManager、NSUserDefaults等[1]

  2. 工厂方式:工厂方式界说了一个用于创立目标的接口,让子类决议实例化哪一个类。在iOS中,类簇的运用是工厂方式的一种运用,如NSNumber、NSArray、NSString等[1]

  3. 装修方式:装修方式能够动态地给一个目标增加一些额定的功用,而不改动原有目标。在iOS中,Category是一种变相的装修者方式,可认为原来的类增加办法[1]

  4. 署理方式:署理方式为某个目标供给一个署理,并由署理目标操控对原目标的拜访。在iOS中,常见的署理方式运用包括UITableViewDelegate、UITextFieldDelegate等[1]

  5. 观察者方式:观察者方式界说了一种一对多的依靠联系,当一个目标的状况产生改动时,一切依靠它的目标都会得到告诉并主动更新。在iOS中,NSNotificationCenter是一种观察者方式的完结,能够完结不同目标之间的消息传递[1]

  6. 指令方式:指令方式将恳求封装成目标,以便运用不同的恳求、行列或者日志来参数化其他目标。在iOS中,常见的指令方式运用包括UIControl的Target-Action机制、NSOperationQueue等[1]

  7. 享元方式:享元方式经过共享目标来削减内存运用,进步功用。在iOS中,常见的享元方式运用包括NSCache、NSURLCache等[1]

这些规划方式在iOS开发中都有广泛的运用,能够依据具体的需求挑选适宜的规划方式来处理问题。


Learn more:

  1. iOS中究竟用到了哪些规划方式 –
  2. iOS规划方式 –
  3. iOS最实用的13种规划方式(全部有github代码) – 简书

常见的路由计划,以及优缺陷比照

iOS常见的路由计划首要包括依据URL类型的路由和依据runtime类型的路由。下面是对这两种路由计划的优缺陷比照:

  1. 依据URL类型的路由计划:

    • 原理:借鉴前端Router和体系App内跳转的办法,经过URL来完结路由恳求。将URL和页面对应联系保存到一个注册表,路由的进程便是经过URL查找对应的页面[2].
    • 长处:
      • 服务器能够动态操控页面跳转,完结灵敏的页面办理。
      • 能够一致处理iOS、Android、H5/RN/Weex等多端的恳求办法。
    • 缺陷:
      • 需求在load办法中注册,影响App发动速度。
      • URL触及硬编码,参数不易保护。
      • 目标类型参数需求运用字典完结[2].
    • 常见第三方库:JLRoutes, Routable-ios, HHRouter, ALRouter[2].
  2. 依据runtime类型的路由计划:

    • 原理:依据Mediator方式和Target-Action方式,运用Objective-C的runtime特性来完结调用。依据路由信息中的target和action,生成target实例,调用对应的action操作,完结路由[2].
    • 长处:
      • 无需注册,充分运用Runtime的特性。
      • 一致组件调用进口,简化组件间的调用联系。
      • 有校验保证安全,对URL进行验证[2].
    • 缺陷:
      • 触及硬编码,部分参数需求打包成字典。
    • 常见第三方库:CTMediator[2].

综上所述,依据URL类型的路由计划适宜需求灵敏办理页面跳转的场景,而依据runtime类型的路由计划则更适宜一致组件调用进口的场景。


Learn more:

  1. iOS 路由计划比照 –
  2. iOS 路由总结大全 – 简书
  3. iOS 组件化 — 路由规划思路剖析

怎么保证iOS项目的稳定性

保证iOS项目的稳定性是一个重要的目标,以下是一些常见的办法和实践来进步iOS项目的稳定性:

  1. 单元测验和集成测验:编写全面的单元测验和集成测验,掩盖项目中的要害功用和鸿沟情况,保证代码的正确性和稳定性。

  2. 继续集成和继续交给:运用继续集成和继续交给东西,主动化构建、测验和部署进程,保证每次代码提交都经过主动化测验,并能够快速部署到生产环境。

  3. 过错监控和日志记载:集成过错监控东西,如Crashlytics、Sentry等,及时捕获和记载运用程序的溃散和反常情况,以便快速定位和修正问题。

  4. 功用优化:进行功用剖析和优化,保证运用程序在各种设备和网络条件下都能够稳定运行,并供给杰出的用户体会。

  5. 内存办理和资源开释:合理办理内存和资源的运用,防止内存走漏和资源浪费,及时开释不再运用的目标和资源。

  6. 反常处理和容错机制:在要害的事务逻辑中增加反常处理和容错机制,防止因反常情况导致运用程序溃散或功用无法正常运行。

  7. 安全性考虑:在开发进程中注重安全性,防止常见的安全缝隙和进犯,如输入验证、数据加密等。

  8. 版别操控和代码查看:运用版别操控体系办理代码,保证代码的可追溯性和可恢复性。进行代码查看,发现和修正潜在的问题和过错。

  9. 更新和保护:及时更新依靠库和结构,修正已知的缝隙和问题。继续进行代码重构和优化,进步代码的可读性和可保护性。

  10. 用户反应和用户体会:活跃搜集用户反应,及时呼应和处理用户遇到的问题,改进用户体会,进步用户满意度。

经过以上的办法和实践,能够进步iOS项目的稳定性,削减潜在的问题和危险,保证运用程序能够稳定运行并供给杰出的用户体会。

怎么规划一个git diff

怎么规划一个git diff

Git diff是用于比较代码之间差异的东西。规划一个git diff需求考虑以下几个方面:

  1. 挑选比较的规模:你能够挑选比较两个commit之间的差异,或者比较两个分支之间的差异。依据你的需求,挑选适宜的比较规模。

  2. 挑选输出格局:Git diff能够以不同的格局输出差异信息,如patch格局、计算信息格局等。依据你的需求,挑选适宜的输出格局。

  3. 挑选比较的算法:Git diff供给了多种比较算法,如默许算法、patience算法、histogram算法等。依据你的需求,挑选适宜的比较算法。

  4. 挑选显现的上下文:Git diff能够显现差异的上下文,你能够挑选显现多少行的上下文信息。依据你的需求,挑选适宜的上下文显现。

  5. 挑选输出的内容:Git diff能够输出差异的具体信息,如修正的行数、增加的行数、删去的行数等。依据你的需求,挑选适宜的输出内容。

下面是一些常用的git diff指令和选项:

  • git diff:比较工作区和暂存区之间的差异。
  • git diff --cached:比较暂存区和最新提交之间的差异。
  • git diff commit1 commit2:比较两个commit之间的差异。
  • git diff branch1 branch2:比较两个分支之间的差异。
  • git diff --stat:以计算信息的方式显现差异。
  • git diff --color-words:以单词为单位显现差异,并运用颜色标记。

Learn more:

  1. Create patch or diff file from git repository and apply it to another different git repository – Stack Overflow
  2. Git Diff | Atlassian Git Tutorial
  3. Git – git-diff Documentation

规划一个线程池?画出你的架构图

在iOS中规划一个线程池,能够运用GCD(Grand Central Dispatch)来完结。下面是一个简略的线程池规划架构图:

+-------------------+
|    Task Queue     |
+-------------------+
|                   |
|                   |
|                   |
|                   |
+-------------------+
         |
         |
         v
+-------------------+
|    Thread Pool    |
+-------------------+
|                   |
|                   |
|                   |
|                   |
+-------------------+

架构图解说:

  • Task Queue(使命行列):用于存储待履行的使命,能够是串行行列或并发行列。使命能够是闭包(block)或自界说的操作目标(Operation)。
  • Thread Pool(线程池):由多个线程组成的池子,用于履行使命行列中的使命。线程池能够是固定巨细的,也能够是动态调整巨细的。

线程池的规划思路:

  1. 创立一个使命行列,用于存储待履行的使命。
  2. 创立一个线程池,包括多个线程,用于履行使命行列中的使命。
  3. 当有使命需求履行时,将使命增加到使命行列中。
  4. 线程池中的线程从使命行列中获取使命并履行。
  5. 履行完使命后,线程返回线程池,等待下一个使命。

线程池的规划能够依据具体需求进行调整,例如能够设置最大线程数、线程的优先级等。


Learn more:

  1. 了解iOS中的线程池
  2. 线程池_ProcessOn思想导图流程图
  3. iOS刨根问底-深化了解GCD – KenshinCui – 博客园

你的app架构是什么,有什么优缺陷、为什么这么做、怎么改进

app架构是依据MVVM(Model-View-ViewModel)的规划方式。

长处:

  • 别离关注点:MVVM将数据逻辑和界面逻辑别离,使得代码愈加明晰和可保护。
  • 可测验性:ViewModel中的事务逻辑能够经过单元测验进行验证,进步代码质量和稳定性。
  • 可复用性:ViewModel能够独立于具体的视图完结,能够在不同的界面中重用。
  • 呼应式编程:经过运用观察者方式和绑定机制,ViewModel能够实时更新视图,供给更好的用户体会。

缺陷:

  • 学习曲线:比较传统的MVC(Model-View-Controller)架构,MVVM需求更多的学习和了解。
  • 引进额定的复杂性:MVVM引进了额定的组件,如ViewModel和绑定机制,增加了代码的复杂性。
  • 项目规模约束:关于小型项目,MVVM或许会显得过于繁琐,不适宜简略的运用。

为什么挑选MVVM架构:

  • 别离关注点:MVVM将数据逻辑和界面逻辑别离,使得代码愈加明晰和可保护。
  • 可测验性:ViewModel中的事务逻辑能够经过单元测验进行验证,进步代码质量和稳定性。
  • 可复用性:ViewModel能够独立于具体的视图完结,能够在不同的界面中重用。
  • 呼应式编程:经过运用观察者方式和绑定机制,ViewModel能够实时更新视图,供给更好的用户体会。

怎么改进:

  • 模块化:将运用拆分为多个模块,每个模块担任特定的功用,进步代码的可保护性和可复用性。
  • 运用依靠注入:经过依靠注入结构,将依靠联系解耦,进步代码的灵敏性和可测验性。
  • 引进一致的数据办理:运用一致的数据办理机制,如Redux或RxSwift,来办理运用的状况和数据流,简化数据处理逻辑。

Learn more:

  1. 优秀的 iOS 运用架构:MVVM、MVC、VIPER,孰优孰劣?
  2. iOS运用架构谈 组件化计划 – Casa Taloyum
  3. 关于做App架构规划的一些思考-阿里云开发者社区

其他问题

哪些bug会导致溃散,怎么防护溃散

iOS常见导致溃散的bug及防护办法如下:

  1. Container Crash(容器类溃散):

    • 常见的容器类溃散包括数组越界、刺进nil等过错操作[1]
    • 防护办法:自界说办法进行交换,并在自界说办法中参加条件约束和判断,防止越界和刺进nil的情况产生[1]
  2. NSString Crash(字符串类溃散):

    • 字符串类溃散或许因为空指针、越界等操作引起[1]
    • 防护办法:在运用字符串的办法前,先进行非空判断,防止空指针引起的溃散[1]
  3. 找不到目标办法或者类办法:

    • 当调用一个不存在的目标办法或者类办法时,会导致溃散[1]
    • 防护办法:在调用办法前,先进行办法是否存在的判断,防止调用不存在的办法[1]
  4. KVO和KVC Crash:

    • 过错运用KVO(键值观察)和KVC(键值编码)或许导致溃散[1]
    • 防护办法:正确运用KVO和KVC,遵循相关规范,防止过错操作引起的溃散[1]
  5. NSNotification Crash:

    • 过错运用NSNotification或许导致溃散,如未移除观察者或者观察者被开释后依然发送告诉[1]
    • 防护办法:在恰当的时候移除观察者,防止观察者被开释后依然接纳告诉[1]
  6. NSTimer Crash:

    • 过错运用NSTimer或许导致溃散,如未及时开释或者重复发动定时器[1]
    • 防护办法:在恰当的时候开释定时器,防止重复发动定时器[1]
  7. Bad Access Crash(野指针):

    • 野指针拜访内存或许导致溃散[1]
    • 防护办法:在运用指针前进行有效性查看,防止野指针拜访[1]
  8. Threading Crash(非主线程改写UI):

    • 在非主线程改写UI或许导致溃散[1]
    • 防护办法:在主线程中改写UI,防止在非主线程中操作UI[1]
  9. NSNull Crash:

    • 过错运用NSNull或许导致溃散,如将NSNull当作其他类型的目标运用[1]
    • 防护办法:在运用NSNull前进行类型判断,防止过错运用NSNull[1]
  10. iOS16上的Crash:

    • iOS16上或许存在新的溃散问题,需求依据具体情况进行防护[1].

以上是iOS常见导致溃散的bug及防护办法。经过合理的防护措施,能够降低运用程序的溃散率,提高运用的稳定性和用户体会。


Learn more:

  1. iOS-各种Crash防护 –
  2. iOS Crash防护 –
  3. ios溃散剖析

怎么监控溃散

在iOS中,能够运用以下办法来监控溃散:

  1. 运用溃散日志搜集东西:有一些第三方东西能够协助你搜集溃散日志,例如Bugly、Firebase Crashlytics等。这些东西能够主动捕获溃散日志并上传到服务器进行剖析和监控。

  2. 注册信号处理函数:iOS中的溃散通常是由信号引起的,你能够注册信号处理函数来捕获溃散信号并进行处理。经过注册signalHandler函数来捕获反常信号,然后在处理函数中获取仓库信息并进行保存或上传[1]

  3. 运用反常处理机制:iOS中的反常处理机制能够协助你捕获和处理反常情况。你能够运用@try-@catch-@finally语法块来捕获反常,并在@catch块中处理反常情况。在反常处理块中,你能够记载反常信息、保存仓库信息等[2]

  4. 运用溃散剖析东西:Xcode供给了溃散剖析东西,能够协助你剖析溃散日志。你能够运用Xcode的”Organizer”功用来查看运用程序的溃散日志,并获取符号化的仓库信息。这些信息能够协助你定位和处理溃散问题[1]

总结:
监控iOS溃散能够运用溃散日志搜集东西、注册信号处理函数、运用反常处理机制或运用溃散剖析东西。这些办法能够协助你及时发现和处理运用程序的溃散问题,进步运用程序的稳定性和用户体会。


Learn more:

  1. 怎么监控iOS的溃散问题 –
  2. [史上最全] iOS Crash/溃散/反常 捕获 – 简书
  3. 怎么全面监控 iOS 千奇百怪的溃散-腾讯云开发者社区-腾讯云

app的发动进程(考察LLVM编译进程、静态链接、动态链接、runtime初始化)

iOS运用的发动进程能够分为以下几个阶段:

  1. 编译阶段:

    • 运用LLVM编译器将源代码编译成可履行文件(Mach-O格局)[1]
    • 静态链接:将运用程序的目标文件与体系库和其他依靠库进行链接,生成最终的可履行文件[1]
  2. 动态链接阶段:

    • 在运用发动时,动态链接器(dyld)会加载运用程序的可履行文件和依靠的动态库[1]
    • dyld会递归加载运用程序一切依靠的动态库,并进行符号绑定和偏移修正[1]
    • 符号绑定:将运用程序中的符号与动态库中的实际地址进行绑定,使得运用程序能够正确调用动态库中的函数和办法[1]
    • 偏移修正:将运用程序中的地址偏移值与运行时分配的ASLR地址相加,得到真实的内存地址[1]
  3. 运行时初始化阶段:

    • ObjC的runtime初始化:注册ObjC相关的类、category,查看selector的仅有性等[1]
    • 履行+load()办法:在动态库加载后,会调用每个类的+load()办法,用于履行一些初始化操作[1]
    • 履行attribute((constructor))润饰的函数:这些函数会在运用发动时主动履行,用于履行一些初始化操作[1]
  4. main()阶段:

    • dyld调用main()函数,开端履行运用程序的主逻辑[1]
    • 调用UIApplicationMain()函数,创立UIApplication目标和AppDelegate目标[1]
    • 调用applicationWillFinishLaunching和didFinishLaunchingWithOptions办法,完结运用程序的初始化,并展现主页[1].

Learn more:

  1. iOS运用的发动流程和优化详解 –
  2. ios-app的发动流程剖析 – 知乎
  3. iOS App发动优化(一)– 了解App的发动流程 –

沙盒目录的每个文件夹区分的作用

沙盒目录是iOS体系中用于存储运用程序数据的文件夹。每个文件夹在沙盒目录中都有特定的作用。以下是沙盒目录中每个文件夹的区分作用:

  1. Documents目录:

    • 用途:用于存储运用程序的用户数据文件。
    • 特色:该目录下的文件会被iTunes同步,能够经过装备完结iTunes共享文件[1]
  2. Library目录:

    • 用途:寄存运用程序的支撑文件和偏好设置文件。
    • 子目录:
      • Caches目录:用于寄存运用程序专用的支撑文件,如缓存图片、离线数据等。该目录下的数据不会被iTunes同步,体系不会主动整理其间的文件。
      • Preferences目录:包括运用程序的偏好设置文件,能够经过NSUserDefaults类来取得和设置运用程序的偏好。该目录下的数据会被iTunes同步[1]
  3. tmp目录:

    • 用途:用于寄存临时文件,如临时下载的文件等。
    • 特色:该目录下的文件不会被iTunes同步,体系会主动整理其间的文件,例如在重新发动手机时[1]

这些文件夹的区分使得运用程序能够依照不同的需求将数据存储在不同的方位,而且能够操控哪些数据会被iTunes同步,哪些数据会被体系主动整理。


Learn more:

  1. iOS 沙盒目录结构及正确运用 – 简书
  2. iOS-沙盒文件目录 –
  3. iOS沙盒存储的基本运用 –

简述下match-o文件结构

Mach-O文件结构是苹果操作体系(OSX和iOS)运用的可履行文件格局。它是一种二进制文件格局,用于存储代码和数据,并界说了程序文件的组成和链接规矩。了解Mach-O文件结构关于了解苹果操作体系的底层机制以及程序的链接和加载进程非常重要。

Mach-O文件由以下几个部分组成:

  1. 文件头(Mach Header):包括了该二进制文件的一般信息,如字节次序、架构类型、加载指令的数量等[1]

  2. 加载指令(Load Commands):是一个包括多个加载指令的表,用于描绘文件的各个部分的方位和特点,如区域的方位、符号表、动态符号表等[1]

  3. 数据区(Data):通常是目标文件中最大的部分,包括了各个段(Segment)的具体数据[1]

具体来说,Mach-O文件的结构如下:

  1. 文件头(Mach Header):包括了文件的一般信息,如字节次序、架构类型、加载指令的数量等。

  2. 加载指令(Load Commands):是一个包括多个加载指令的表,描绘了文件的各个部分的方位和特点。

  3. 数据段(Segment):寄存数据,包括代码、字符常量、类、办法等。一个Mach-O文件能够有多个数据段,每个段能够包括多个区域(Section)。

  4. 符号表(Symbol Table):将地址和符号联系起来的桥梁,存储了符号在字符串表中的方位。

  5. 字符串表(String Table):存储了一切的变量名、函数名等字符串。

  6. 动态符号表(Dynamic Symbol Table):存储了动态链接的符号在符号表中的偏移信息。

以上是Mach-O文件的基本结构,更具体的了解能够参阅官方文档和相关材料。


Learn more:

  1. 详解 Mach-O 文件结构 – 简书
  2. 聊聊 Mach-O 文件格局 | geneblue’s blog
  3. Mach-O文件结构 –