2024最新!!!iOS高级面试题,全!(二)

iOS应用是如何启动以及如何优化
pre-main阶段
加载动态链接器dyld到App进程
加载动态库(包括所依赖的所有动态库)
Rebase 修正内部的指针指向
Bind 修正外部指针指向 
初始化Objective C Runtime 包括oc的类、分类的注册,selector唯一性检查等
初始化代码,调用Oc类和分类的+load方法,构造器函数的调用(用attribute((constructor))修饰的函数、创建C++静态全局变量等
执行main函数后,调用didFinishLaunching方法完成初始化
对于pre-main阶段的耗时测量方法,在 Xcode 中 Edit scheme -> Run -> Auguments 将环境变量DYLD_PRINT_STATISTICS 设为1 。之后控制台会输出耗时。DYLD_PRINT_STATISTICS_DETAILS
建议应用的启动时间控制在400ms之下,并且在20s内启动,否则系统会kill app。
一般是优化main函数阶段,大多数的耗时是在自己写的代码里 
优化方法:
减少自定义的动态库数量,合并动态库,官方建议不超过6个。因为动态库的加载方式比静态库慢。如果必须依赖动态库,则把多个非系统的动态库合并成一个动态库。静态库是在编译时将库的代码打包到可执行程序中,动态库则是在运行时动态加载到程序中的。
减少Objective-C类,分类和Selector的个数,类似功能尽量合并
减少使用构造器函数
减少使用oc的load
减少c++静态全局变量
压缩资源图片,,因为在启动加载时会加载资源图片进行IO操作。所以图片小加载速度也会显著提升。
删除无用的方法和类,多用Swift Structs,因为Swfit Structs是静态分发的
延迟初始化那些不必要的UIViewController。
didFinishLaunching中,耗时操作的优化
类和方法名不要太⻓。
Load和initialize的不同
调用顺序不同,以main函数为分界,+load方法在main函数之前执行,+initialize在main函数之后执行。
子类中没有实现+load方法,子类不会调用父类的+load方法;而子类如果没有实现+initialize方法的话,也会自动调用父类的+initialize方法。
+load方法是在类被装在进来的时候就会调用,+initialize在实例化对象的时候调用,并且只会调用一次,是懒加载模式,如果这个类一直没有使用,就不回调用到+initialize方法。
@property 的本质是什么?
@property的本质是实例变量(ivar)+ 存取方法
,即 @property = ivar + getter + setter;
属性” (property)作为 Objective-C 的特性,主要用于封装对象中的数据。 Objective-C 对象数据保存为实例变量。实例变量一般通过“存取方法”来访问。 getter读取,setter写入。
@property中有哪些属性关键字?/ @property 后面可以有哪些修饰符?
atomic、nonatmoic、readonly、readwrite、assign、weak、strong、copy
什么情况使用 weak 关键字,相比 assign 有什么不同?
什么情况使用 weak 关键字?
循环引用的时候,比如: delegate 代理属性
xib的IBOutlet 控件属性一般也使用 weak
不同点:
assigin 可以修饰非 OC 对象,比如简单数据类型 int bool,weak 必须用于 OC 对象,
weak 是弱引用,被weak修饰的对象,引用计数不会加1 不会产生野指针。weak修饰的对象释放后,指针会自动被置nil,是安全的。
assign 修饰基本数据类型是安全的。如果修饰对象,会产生野指针;修饰的对象释放后,指针不会自动置空。
所以一般都是用 assign 来修饰基本类型,weak 来修饰对象
__weak  __block
通过 __weak 弱引用,来打破循环引用。
__block:__block修饰的变量可以修改。在代码块中会被retain(ARC)__weak:__weak修饰的变量不可以修改。不会在block代码块中被retain
__block不能修饰全局变量、静态变量(static)
block本质和说明
block闭包,本质上也是对象,是一段代码块,是带有自动变量的匿名函数,可以精简代码减少耦合
block使用的时候,可以作为变量使用,可以作为方法参数,也可以做为属性或实例变量
他有个特性叫变量捕获机制,(block内部会捕捉外部变量,auto局部变量直接捕获值,static修饰的变量捕获指针,全局变量不捕获)
Auto局部变量:我们平时写的局部变量,默认就带着 auto (自动变量,离开作用域就销毁)
在 Block 内部修改 外部变量 需要用 __block
使用block时要特别注意循环引用,避免互相持有对方的强引用,导致它们无法被释放,从而造成内存泄漏。 __weak来打破循环引用。
block内部如何修改变量的值
这个问题一般问的是修改局部变量的值,因为全局变量直接可以访问到,不存在修改不了的情况
如何修改局部变量的值:第一种:直接使用static修饰。第二种:局部变量改为全局变量。第三种:使用__block修饰变量
注意:只要不对变量/对象 的值进行修改 就不要去使用__block
block分类
.引用全局变量、全局静态变量、局部静态变量:Block 在全局区,属于 GlobalBlock
b.引用普通外部变量,用 copy,strong 修饰的 Block 就存放在堆区,属于 MallocBlock;
用 weak 修饰的Block 存放在栈区,属于 StackBlock
RunLoop
事件驱动/事件循环 的一个对象。没有消息需要处理时,休眠;有消息需要处理时,唤醒
main函数为什么可以一直运行而不退出?内部维护了一个主线程RunLoop
1、RunLoop与NSTimer
一个比较常见的问题:滑动tableView时,定时器不生效,因为在滑动时会切换RunLoop的mode,不在defaultmode下了,所以失效,可以放到commonmode下解决。commonMode是否使用过,怎样理解?相当于defaultmode和TrackingMode的集合
怎样保证子线程数据回来更新UI的时候不打断用户的滑动操作?
将更新UI事件放在主线程的NSDefaultRunLoopMode上执行,滑动是在UITrackingRunLoopMode上执行
一个线程对应一个runloop,主线程自动运行runloop,但是子线程的runloop需要手动运行
怎样实现一个常驻线程?
每次开辟子线程都会消耗cpu,在需要频繁使用子线程的情况下,会消耗大量的cpu,而且创建线程都是任务执行完成之后也就释放了,不能再次利用
向子线程runloop中添加空定时器保持唤醒
runtime
运行时
动态属性 objc_setAssociatedObject objc_getAssociatedObject
动态创建类 objc_allocateClassPair objc_registerClassPair
交换方法 swizzlingInstanceMethodInClass
例子:Scrollview的头部空白;
解决方法是设置其contentInsetAdjustmentBehavior属性为UIScrollViewContentInsetAdjustmentNever。但对于现存的项目来说挨个修改工作量无疑是巨大的,也容易出问题。这时候就用到Runtime了,用runtime来交换其初始化方法来统一设置这个属性就可以得到解决。
获取类的一些信息(包括属性列表,方法列表,成员变量列表,和遵循的协议列表)
//1.获取成员变量列表class_copyIvarList
//2.获取属性列表class_copyPropertyList
//3.获取方法列表class_copyMethodList
//4.获取协议列表class_copyProtocolList
设计模式
工厂模式 将创建对象的方法进行封装,调用即可创建对象
单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。  UIApplication userdefault 
dispatch_once private static let test = .init
代理模式 UITableViewDatasource UITableViewdelegate uitexttfielddelegate等,适用于告知代理对象进行事件处理
观察者模式KVO 添加监听,发生变化时触发监听方法,使用结束后移除监听。一般是通过notificationcenter addobserver,他是一个单例,一对多的消息广播模式
kvc键值编码
架构模式
Mvc mvvm
‌MVC 通过controller来协调model和view之间的交互,将代码变得模块化
mvvm在mvc的基础上,衍生出了viewmodel来处理model的数据,复用性更高,ViewModel 处理 网络请求、数据逻辑和缓存读写等等
微服务架构,特别适合大型的项目,可以将模块单独拆分成不同的project,然后嵌入到项目中,kite有微服务架构的思想
设计原则
单一职责原则强调一个类或模块只负责一项功能,例如CALayer负责动画和视图显示,而UIView则提供显示内容和事件处理。
开闭原则要求对修改关闭,对扩展开放,例如通过使用category来实现功能的扩展。要考虑到后续的扩展性,而不是在原有的基础上来回修改
依赖倒置原则指出抽象不应该依赖于具体实现,而实现应该依赖于抽象,这有助于提高代码的灵活性和可维护性。
里氏替换原则表明子类必须能够替换其基类而不会引起程序行为的变化,这在面向对象编程中尤为重要。
接口隔离原则使用多个专门的协议来做接口隔离、而不是一个庞大臃肿的协议
UITableviewDelegate
UITableViewDataSource
迪米特法则,也称为最少知识原则,强调一个对象应当对其他对象尽可能少的依赖,以减少类与类之间的耦合。实现高聚合、低耦合 
App的优化
启动过程耗时
优化内存泄露,包括循环引用
优化闪退或卡死
优化过大图片、冗余文件
控制ipa包体积
页面流畅度
cocoapod
Swift Package Manager
Alamofire:http网络请求框架 要在Alamofire之后解析JSON,定义一个遵循Codable协议的Swift结构体或类,然后使用 JSONDecoder,可以设置 CodingKeys
11、SnapKit:autoLayout自动布局框架
12、Kingfisher:喵神王巍写的一款关于图片下载、缓存的框架。灵感取自OC里面的SDWebImage
4、RxSwift:函数响应式编程框架,是ReactiveX的swift版本,可以简化异步操作和事件/数据流
8、ObjectMapper:把json对象映射为model对象
不可变对象的copy是浅复制,mutablecopy是深复制
可变对象的copy与mutablecopy都是深复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/881689.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《飞机大战游戏》实训项目(Java GUI实现)(设计模式)(简易)

目录 一、最终实现后,效果如下。 (1)简单介绍本游戏项目(待完善) (2)运行效果图(具体大家自己可以试) 初始运行情况。 手动更换背景图。 通过子弹攻击敌机,累…

828华为云征文|Flexus云服务器X实例部署宝塔运维面板

本次华为云Flexus云服务器X实例部署宝塔运维面板教学,这次是推陈出新啊 之前的云耀云服务器L实例已经很不错了,大力赞叹华为云的 同时感谢华为云提供优惠卷,只能说白嫖真是太棒了 华为云近期正在筹办华为云828企业节活动,90款免…

HarmonyOS Next开发----使用XComponent自定义绘制

XComponent组件作为一种绘制组件,通常用于满足用户复杂的自定义绘制需求,其主要有两种类型"surface和component。对于surface类型可以将相关数据传入XComponent单独拥有的NativeWindow来渲染画面。 由于上层UI是采用arkTS开发,那么想要…

【RabbitMQ】消息分发、事务

消息分发 概念 RabbitMQ队列拥有多个消费者时,队列会把收到的消息分派给不同的消费者。每条消息只会发送给订阅该队列订阅列表里的一个消费者。这种方式非常适合扩展,如果现在负载加重,那么只需要创建更多的消费者来消费处理消息即可。 默…

深度学习01-概述

深度学习是机器学习的一个子集。机器学习是实现人工智能的一种途径,而深度学习则是通过多层神经网络模拟人类大脑的方式进行学习和知识提取。 深度学习的关键特点: 1. 自动提取特征:与传统的机器学习方法不同,深度学习不需要手动…

【数据库】常用数据库简介

目录 🍔 常用的关系型数据库 🍔 Mysql简介 🍔 SQL 简介 SQL语句的分类 SQL 写法 SQL 常用的数据类型 🍔 DDL语句 对数据库的操作 对数据表的操作 🍔 DML语句 插入数据 insert into 修改数据 update 删除数…

python实现多个pdf文件合并

打印发票时,需要将pdf合并成一个,单页两张打印。网上一些pdf合并逐渐收费,这玩意儿都能收费?自己写一个脚本使用。 实现代码: 输入pdf文件夹路径data_dir,统计目录下的“合并后的PDF”文件夹下,…

linux重要文件

/etc/sysconfig/network-scripts/ifcfg-eth1 网卡重启 /etc/init.d/network restart ifup ethname & ifdown ethname /etc/resolv.conf 设置Linux本地的客户端DNS的配置文件 linux客户端DNS可以在网卡配置文件(/etc/sysconfig/network/ifcfg-eth0 DNS2)里配置 也可以在/et…

Java_Day04学习

类继承实例 package com.dx.test03; public class extendsTest {public static void main(String args[]) {// 实例化一个Cat对象,设置属性name和age,调用voice()和eat()方法,再打印出名字和年龄信息/********* begin *********/Cat cat ne…

Pandas -----------------------基础知识(一)

目录 Series对象 属性和方法 布尔值列表获取Series对象中部分数据 运算 DateFrame对象 常用属性 常见方法 运算 总结 Series对象 是DataFrame的列对象或者行对象 生成Series对象生成索引使用元组创建Series对象使用字典创建Series对象 通过Pandas创建对象 自定义索引 …

面试官问:你最自豪的成就是什么?

当面试官问你最自豪的成就是什么,我们首先分析面试官为什么这么问,他想通过这问题得到什么信息? 你最自豪的成就是什么? 其实反应了一个人的职业驱动力,比如我们常说的:上进心,主动积极性&…

【机器学习-监督学习】朴素贝叶斯

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…

【小沐学GIS】基于Openstreetmap创建Sionna RT场景(Python)

文章目录 1、简介1.1 blender 2、下载和安装2.1 Python2.2 jupyter 3、运行结语 1、简介 1.1 blender https://www.blender.org/ Blender 是一款免费开源的3D创作套件。 使用 Blender,您可以创建3D可视化效果,例如静态图像、3D动画、VFX(…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第一篇-原理】

如果想直接制作,请看【第二篇】内容 这次做一个这样的东西,通过在2DRT上实时绘制,生成动态的体积纹理,也就是可以runtime的VDB 设想的文章流程: 对原理进行学习制作体积渲染制作实时绘制 第一篇(本篇)是对“…

【Rust练习】16.模式

文章题目来自:https://practice-zh.course.rs/pattern-match/patterns.html 1 🌟🌟 使用 | 可以匹配多个值, 而使用 … 可以匹配一个闭区间的数值序列 fn main() {} fn match_number(n: i32) {match n {// 匹配一个单独的值1 > println!(…

【赵渝强老师】K8s中的Deployment控制器

K8s的Deployment将Pod部署成无状态的应用程序,它只关心Pod的数量、Pod更新方式、使用的镜像和资源限制等。由于是无状态的管理方式,因此Deployment中没有角色和顺序的概念,换句话说:Deployment中没有状态。   通过使用Deploymen…

【远程调用PythonAPI-flask】

文章目录 前言一、Pycharm创建flask项目1.创建虚拟环境2.创建flask项目 二、远程调用PythonAPI——SpringBoot项目集成1.修改PyCharm的host配置2.防火墙设置3.SpringBoot远程调用PythonAPI 前言 解决Pycharm运行Flask指定ip、端口更改无效的问题 首先先创建一个新的flask项目&…

C语言 | Leetcode C语言题解之第415题字符串相加

题目: 题解: char* addStrings(char* num1, char* num2) {int i strlen(num1) - 1, j strlen(num2) - 1, add 0;char* ans (char*)malloc(sizeof(char) * (fmax(i, j) 3));int len 0;while (i > 0 || j > 0 || add ! 0) {int x i > 0 ?…

Games101学习 - 着色

本文主要讲述Games101中的着色部分。 文中将使用UE的UTexture2D接口,若不了解可以看这篇: https://blog.csdn.net/grayrail/article/details/142165442 1.面积比计算三角形坐标 通过三角形面积比可以得到三角形的坐标alpha、beta、gamma从而进行插值&a…

ChatGPT 4o 使用指南 (9月更新)

首先基础知识还是要介绍得~ 一、模型知识: GPT-4o:最新的版本模型,支持视觉等多模态,OpenAI 文档中已经更新了 GPT-4o 的介绍:128k 上下文,训练截止 2023 年 10 月(作为对比,GPT-4…