iOS 面试问题
文章平均质量分 89
iOS面试中各种问题
xiaoxiaobukuang
欢迎大家提意见
展开
-
iOS 组件化
一、为什么需要组件化随着公司业务的不断发展,项目的功能越来越复杂,各个业务代码耦合越来越多,代码量急剧增加,传统的 MVC 或者 MVVM 架构已经无法高效的管理工程代码,因此需要用一种技术来更好地管理工程,而组件化是一种能够解决代码耦合的技术。项目经过组件化的拆分,不仅可以解决代码耦合的问题,还可以增强代码的复用性,工程的易管理性等。组件化的优势有利于代码模块的封装和复用。对不同的业务模块可以进行物理隔离(通过git私有 仓库权限控制),进一步提升代码的稳定性和安全性。项目整体结构层次分明,便原创 2022-01-04 14:53:09 · 2610 阅读 · 0 评论 -
iOS 设计模式
一、六大设计原则单一职责原则依赖倒置原则开闭原则里氏替换原则接口隔离原则迪米特法则1、单一职责原则一个类只负责一件事2、依赖倒置原则抽象不应该依赖于具体实现,具体实现可以依赖于抽象3、开闭原则对修改关闭、对扩展开放4、里氏替换原则父类可以被子类无缝替换,且原有功能不受任何影响5、接口隔离原则使用多个专门的协议,而不是一个庞大臃肿的协议协议中的方法尽量少6、迪米特法则一个对象应当对其他对象有尽可能少的了解高内聚、低耦合二、责任链问题:解决方案:...原创 2021-05-12 13:55:56 · 261 阅读 · 0 评论 -
iOS 网络
#mermaid-svg-dnotgPy8NLSxqDWV .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-dnotgPy8NLSxqDWV .label text{fill:#333}#mermaid-svg-dnotgPy8NLSxqDWV .node rect,#mermaid-svg-dnotgPy8NL原创 2021-05-11 16:26:09 · 274 阅读 · 0 评论 -
iOS RunLoop
参考: https://www.cnblogs.com/kenshincui/p/6823841.html https://www.jianshu.com/p/b9426458fcf6 http://www.cocoachina.com/ios/20150601/11970.html一、RunLoop概念通常所说的RunLoop指的是NSRunloop或者CFRunloopRef...原创 2018-04-20 17:17:55 · 1375 阅读 · 0 评论 -
iOS 多线程
#mermaid-svg-AxD3XhAQartdSFY5 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-AxD3XhAQartdSFY5 .label text{fill:#333}#mermaid-svg-AxD3XhAQartdSFY5 .node rect,#mermaid-svg-AxD3XhAQar原创 2021-05-08 18:09:25 · 171 阅读 · 0 评论 -
iOS NSThread和线程锁
一、NSThread 多线程的优缺点:优点:NSThread比NSOperation和GCD轻量级;缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。二、NSThread的使用:1、NSThread有两种直接创建方式:①、- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)arg原创 2015-12-26 21:18:31 · 1130 阅读 · 0 评论 -
iOS 多线程 NSThread
每个iOS应用程序都有个专门用来更新显示UI界面、处理用户的触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验。一般的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程编程是防止主线程堵塞,增加运行效率的最佳方法。iOS支持多个层次的多线程编程,层次越高的抽象程度越高,使用也越方便,也是苹果最推荐使用的方法。下面根据抽象原创 2015-12-26 21:25:18 · 471 阅读 · 0 评论 -
iOS 线程池NSOperationQueue
往线程池(NSOperationQueue)中添加任务(NSOperation),线程池中的线程可看作消费者,从队列中取走任务,并执行它。一、NSOperationQueue多线程的优缺点:优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上;Cocoa operation相关的类是NSOperation,NSOperationQueue。NSOperation是个抽象原创 2015-12-26 21:49:13 · 848 阅读 · 0 评论 -
iOS Grand Central Dispatch(GCD)
一、Grand Central Dispatch(GCD)概要1、什么是GCDGrand Central Dispatch(GCD)是异步执行任务的技术之一。 GCD用我们难以置信的非常简洁的记述方法,实现了极为复杂繁琐的多线程编程。 例如:dispatch_async(queue, ^{ //长时间处理 //例如AR用动画识别 //例如数据库访问原创 2016-05-27 11:36:06 · 3262 阅读 · 0 评论 -
iOS Grand Central Dispatch(GCD)
一、GCD多线程的优缺点优点: ①、易用:GCD比NSThread和NSOperationQueue简单易用。由于GCD基于work unit而非像NSThread那样基于运算,所以GCD可以控制诸如等待任务结束、监视文件描述符、周期执行代码以及工作挂起等任务。基于blick的协同导致它能极为简单得在不同代码作用域之间传递上下文;②、效率:GCD被实现得如此轻量和优雅,使得它在很多地方比之大专原创 2015-12-26 22:14:11 · 430 阅读 · 0 评论 -
iOS block
一、Blocks概要Blocks是C语言的扩充功能:带有自动变量(局部变量)的匿名函数。 顾名思义,所谓的匿名函数就是不带有名称的函数。c语言的标准不允许存在这样的函数。例如:int func (int count);int resule = func(10);如果想使用函数指针来代替直接调用函数,那么似乎不用知道函数名也能够使用该函数int func (int count);int (*fu原创 2016-05-23 21:30:15 · 3845 阅读 · 0 评论 -
iOS Block
#mermaid-svg-bf4zeaT6GaxRXT7K .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-bf4zeaT6GaxRXT7K .label text{fill:#333}#mermaid-svg-bf4zeaT6GaxRXT7K .node rect,#mermaid-svg-bf4zeaT6Ga原创 2021-05-07 09:53:04 · 165 阅读 · 0 评论 -
iOS 内存管理
内容管理相关问题一、内存布局stack(栈区):方法调用heap(堆区):通过alloc等分配的对象bss(未初始化数据):未初始化的全局变量等data(已初始化数据):已初始化的全局变量等text(代码段):程序代码二、内存管理方案TaggedPointer:用于优化NSNumber,NSDate,NSString等小对象的存储。NSNumber指针里边存储的数据是:tag+data,也就是直接将数据存储在指针里。这样做特别节省空间。如果这个数据特别大,指针存储不下这个数,那么会原创 2021-04-29 15:49:06 · 391 阅读 · 0 评论 -
iOS 自动引用计数
本文来自Objective-C高级编程(iOS与OS X多线程和内存管理)一、什么是自动引用计数自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术;苹果官方说明: 在Objective-C中采用Automatic Reference Counting(ARC)机制,让编译器来进行内存管理。在新一代Apple LLVM编译器中设置原创 2016-05-19 16:19:21 · 5251 阅读 · 0 评论 -
iOS runtime之Method Swizzling(四)
一、Method Swizzling是什么Method Swizzling是改变一个selector的实际实现的技术。 在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的; 之前所说的消息转发虽然功能强大,但需要我们了解并且能原创 2016-04-15 15:53:17 · 559 阅读 · 0 评论 -
iOS runtime之消息传递(三)
一、runtime中的消息1、什么是消息①、message(消息) message的具体定义很难说,因为并没有真正的代码描述,简单的讲message 是一种抽象,包括了函数名+参数列表,他并没有实际的实体存在。②、method(方法) method是真正的存在的代码。如:- (int)meaning { return 42; }③、selector(方法选择器) selector 通过S原创 2016-04-14 17:53:11 · 3226 阅读 · 0 评论 -
iOS runtime之类和对象(二)
每个Class都有一个isa指针指向一个唯一的Meta Class每一个Meta Class 的isa 指针都指向Meta Class,即NSObject的MetaClass,而最上层的MetaClass的isa指针又指向自己。一、对象、类对象、元类对象1、类对象类对象存储实例方法列表等信息类对象是程序猿定义并在运行时由编译器创建的,它没有自己的实例变量,这里需要注意的是类的成员变量和实例方法是属于实例对象的,但其存储于类对象当中的。2、实例对象实例对象是我们对类对象alloc或者new..原创 2020-09-03 18:04:01 · 153 阅读 · 0 评论 -
iOS runtime之类和对象(二)
一、类与对象基础数据结构1、ClassObjective-C类是由Class类型来表示的,它实际上是一个指向objc_class结构体的指针。它的定义如下:typedef struct objc_class *Class;objc_class在runtime.h定义如下:struct objc_class { Class isa OBJC_ISA_AVAILABILITY;// metac原创 2016-04-11 17:58:37 · 2478 阅读 · 0 评论 -
iOS runtime之元素认知(一)
一、什么是runtime简而言之,Objective-C Runtime是一个将C语言转化为面向对象语言的扩展。我们将C++和Objective进行对比,虽然C++和Objective-C都是在C的基础上加入面向对象的特性扩充而成的程序设计语言,但二者实现的机制差异很大。C++是基于静态类型,而Objective-C是基于动态运行时类型。也就是说用C++编写的程序编译时就直接编译成了可令机器读懂的机器语言;用Objective-C编写的程序不能直接编译成可令机器读懂的机器语言,而是在程序运行的时候,通过原创 2020-09-03 15:10:17 · 206 阅读 · 0 评论 -
iOS runtime之元素认知(一)
一、什么是runtime简而言之,Objective-C Runtime是一个将C语言转化为面向对象语言的扩展。 我们将C++和Objective进行对比,虽然C++和Objective-C都是在C的基础上加入面向对象的特性扩充而成的程序设计语言,但二者实现的机制差异很大。C++是基于静态类型,而Objective-C是基于动态运行时类型。也就是说用C++编写的程序编译时就直接编译成了可令机器读懂原创 2016-04-10 00:12:53 · 796 阅读 · 0 评论 -
iOS 属性关键字
一、分类读写权限原子性引用计数二、读写权限readwrite 读写,readonly 只读。属性默认是readwrite,支持读写。1、readonly属性只具有get方法;2、readwrite属性同时具有set和get方法;三、原子性1、nonatomic非原子的,atomiiac原子的。属性默认是atomiac,也就是原子性的。nonatomic执行效率高。2、atomic读写安全,但效率低,不是绝对的安全,比如操作数组,增加或移除买这种情况下使用互斥锁来保证线程安全。原创 2020-09-01 11:58:32 · 398 阅读 · 0 评论 -
iOS KVC
一、KVC简介KVC全称是Key Value Coding(键值编码),是一个基于NSKeyValueCoding非正式协议实现的机制,他可以直接通过Key值对对象的属性存取操作,而不需通过明确的存取方法。这样就可以在运行时动态在访问和修改对象的属性,而不是在编译时确定。KVC提供了一种间接访问属性方法或成员变量的机制,可以通过字符串来访问对象的属性方法或成员变量;在实现了访问器方法的类中,使用点语法和KVC访问对象其实差别不大,二者可以任意混用(因为KVC会首先搜索访问器方法,见下文)。但是没有访原创 2020-08-28 17:34:00 · 488 阅读 · 0 评论 -
iOS KVO
一、kvo概述kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作。二、kvo实现原理kvo是如何实现通知对象的呢,其实这是通过Objective-C强大的runtime运行时机制实现的。当你第一次观察某个对象时,runtime会创建一个新的继承被监听类的子类。在这个新的类中,它会重原创 2016-08-25 10:53:12 · 3964 阅读 · 0 评论 -
iOS 通知(NSNotification)
一、通知1、基本概念NSNotification是iOS中一个调度消息通知的类,采用单例模式设计,在程序中实现传值、回调等地方应用很广。在iOS中,NSNotification & NSNotificaitonCenter是使用观察者模式来实现的用于跨层传递消息。2、什么情况下使用通知观察者模式:定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得道通知并自动更新。二、通知的特点是使用观察者模式来实现的用于跨层传递消息的机制;传递方式为一对多;三原创 2020-08-20 13:53:11 · 3087 阅读 · 0 评论 -
iOS 代理(Delegate)
一、代理的特点准确的说是一种软件设计模式iOS当中以@protocol形式提现传递方式一对一二、代理的基本使用代理是一种通用的设计模式,在iOS中有特定的语法来实现代理模式,OC语言可以通过@Protocol实现协议。1、代理组成部分协议:用来指定代理双方可以做什么,必须做什么。代理:根据协议,完成委托方需要实现的功能(方法)。委托:根据协议,指定代理去完成什么功能。2、协议(Protocol)的概念从上图中我们可以看到三方之间的关系,在实际应用中通过协议来规定代理双方的行为原创 2020-08-17 09:49:46 · 3741 阅读 · 0 评论 -
iOS 扩展(Extension)
一、扩展的作用声明私有属性声明私有方法声明私有成员变量二、扩展的特点编译时决议只以声明的形式存在,多数情况下寄生在宿主类的.m中不能为系统类添加扩展三、扩展和分类的区别分类是运行时决议;扩展是编译时决议;(所以扩展中声明的方法没有被实现,编译器会报警,但是分类种的方法没有被实现编译器是不会有任何警告的)分类原则上能增加属性,实例方法,类方法,协议,并且是公开的;扩展能添加方法,实例变量,默认是@private类型的,且只能作用于自身类,而不是子类或者其他地方;分类有自己的实现原创 2020-08-14 14:41:58 · 1899 阅读 · 0 评论 -
iOS +load与+initialize
一、loadApple文档中这样描述,传送门1、load源码解析调用方式类load调用源码load的方法中直接拿到load方法的内存地址直接调用方法。分类调用源码分类中也是通过直接拿到load方法的地址进行调用。因此正如我们之前试验的一样,分类中重写load方法,并不会优先调用分类的load方法,而不调用本类中的load方法了。2、 load函数调用特点当类被引用进项目的时候就会执行load函数(在main函数开始执行之前),与这个类是否被用到无关,每个类的load函数只会自动调用原创 2020-08-07 15:24:32 · 470 阅读 · 0 评论 -
iOS 分类(Category)
一、分类的使用场景可以减少单个文件的体积可以按照功能分组,放到不同的分类里,使类结构更清晰降低耦合性,同一个类可以有多个开发人员进行开发模拟多继承把静态库的私有方法公开二、分类的底层结构在runtime文件objc-runtime-new.h中,找到分类category_t的结构体:struct category_t { const char *name; //分类的名称 classref_t cls; //类 struct method_list_t *i原创 2020-08-06 18:42:34 · 2332 阅读 · 0 评论 -
iOS 离屏渲染
一、图像渲染工作原理具体查看iOS 图像显示原理及卡顿掉帧的原因UIView的绘制原理二、离屏渲染屏幕渲染有以下两种方式:On-Screen Rendering当前屏幕渲染,指的是在当前用于显示的屏幕缓冲区中进行渲染操作。Off-Screen Rendering离屏渲染,指的是 GPU 或 CPU 在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。过程中需要切换 contexts (上下文环境),先从当前屏幕切换到离屏的contexts,渲染结束后,又要将 contexts 切换回来,而切原创 2020-08-05 20:26:57 · 208 阅读 · 0 评论 -
iOS UIView的绘制原理
一、UIView的绘制原理当UIView调用setNeedDisplay之后,实际上并没有立即发生位图的绘制工作,而是在之后的某个时机进行当前UI视图的真正绘制工作。当我们调用UIView的setNeedDisplay方法之后,系统会调用view对应layer的setNeedsDisplay方法,相当于在当前layer上打了一个标记;在当前runloop即将结束的时候调用CALayer的display方法,然后进入我们视图的真正绘制工作。CALayer的display方法在它的内部实现当中,首先原创 2020-08-05 16:37:19 · 1162 阅读 · 0 评论 -
iOS 图像显示原理及卡顿掉帧的原因
首先我们了解一下iOS图像显示的原理关于CPU和GPU两个硬件都是通过总线连接起来的,CPU主要处理UI的布局和一些文本信息的计算以及整个绘制过程图片编解码,最后在合适的时机提交位图给GPU。而我们的GPU则是负责对位图进行渲染,最后将渲染好的位图放到帧缓存区。由视频控制器在指定时间之前去帧缓冲区提取显示内容,通过显示屏显示出来。举例说明当我们创建一个UIView控件之后,它的显示部分由CALayer负责;CALayer当中有一个contents属性,就是我们要绘制屏幕当中的位图;比如说我们创原创 2020-08-05 14:50:33 · 2071 阅读 · 0 评论 -
iOS 事件传递和视图响应链
一、事件传递1、事件的分类multitouch events:所谓的多点触摸事件,即用户触摸屏幕交互产生的事件类型;motion events:所谓的移动事件。是指用户在摇晃、移动和倾斜手机的时候产生的事件称为移动事件。这类事件依赖于iPhone手机里边的加速器,陀螺仪等传感器;remote control events:所谓的远程控制事件。指的是用户在操作多媒体的时候产生的事件。比如,播放音乐,视频等。2、触摸事件UIEventiOS将触摸事件定义第一个手指开始触摸屏幕到最后一个手指离原创 2020-08-04 18:34:52 · 937 阅读 · 0 评论 -
iOS 数据源同步问题
当我们开启子线程处理数据源的时候,主线程的操作并没有记录在子线程中。这样就会导致子线程处理完数据返回主线程刷新UI后数据错乱。例子:比如说tableView中显示新闻数据和广告,子线程进行网络请求,数据解析等操作的同时。主线程中删除了广告,并更新UI。然后子线程处理完数据,最终也在主线程中更新UI,子线程没有记录主线程的删除操作,导致数据源没有同步的问题。解决办法如下1、并发访问,数据拷贝通过上图我们可以了解当主线程做了一次删除操作的时候,我们需要将这个操作记录下来,并且当子线程需要操作的时候进行原创 2020-08-04 14:46:51 · 540 阅读 · 3 评论 -
iOS UITableView的重用机制
一、重用机制1、UITableView内部中有两个NSMutableArray:当前显示的cell集合——visiableCells;可重用cell的集合:reusableTableCells;2、UITableView开始时,visiableCells为空,reusableTableCells为空;3、tableView显示在屏幕中时,通过下面方法- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(N原创 2020-08-04 13:18:10 · 406 阅读 · 0 评论