'写给读者的话👇'
这些是我对iOS面试时会碰到的问题的解决方法,梳理和整合百度、阿里等100家企业面试题,想要更加详细的查看题目的回答,已链接出比较完全的答案,出来分享给大家,题目下的回答有点错误那也是正常的了,希望对大家有所帮助。大家有更好的解决办法也欢迎沟通交流。对于技术不足之处,还望谅解和大佬的指导!!🎈
最后欢迎加入我的iOS交流圈资料获取:
+裙:196800191 或者是+ WX(XiAZHiGardenia)免费获取! 获取面试资料 简历模板 一起交流技术
分享内容包括逆向安防、算法、架构设计、多线程,网络进阶,还有底层、音视频、Flutter等等......
重点是免费喔!!!
这下面的回答可能有些不全面,但是已经链接其他文章可以直接点击题目!!查看详情答案🎈
1、2020 iOS面试题----swift和oc的区别?
- (1) 最明显的区别:OC一个类由.h和.m两个文件组成,而swift只有.swift一个文件,所以整体的文件数量比OC有一定减少。
- (2) Swift更易于维护,文件分离后结构更清晰
- (3) swift与OC的主要区别就是语法区别,其他大抵相同.
区别1: swift中使用let定义常量,var定义变量.常量一经赋值,不可以进行修改,变量赋值后可更改.
swift能够根据右边的代码,推倒出该变量的准确类型.
2、2020 iOS面试题——编译链接?
- (1)id 和 in sta ncetype 的区别
in sta ncetype只能做返回值,编译时判断真实类型,不符合发警告 特殊情况:关联类型返回方法,如类方法alloc或new开头,实例方法中,以 autorelease,i nit,reta in,或 self 开头
3、2020 iOS面试题——synthesize & denamic
- (1)通过@$『nthesize指令告诉编译器在编译期间产生getter/setter方法。 2:通过@4『namic指令,自己实现方法。
有些存取是在运行时动态创建的,如在CoreData的NSMa nagedObject类使 用的某些。如果你想这些情况下,声明和使用属性,但要避免缺少方法在 编译时的警告,你可以使用@dyn amic动态指令,而不是@sy nthesize合成 指令。
4、2020 iOS面试题——在项目开发中常用的开发工具有哪些?
- (1) instrument
- (2) beyondCompare
- (3) git
Xcode 是苹果公司在 2003 年推出,并运行在 Mac OS X 上的集成开发环境工具,可用于开发 Mac OS X 以及 iOS 平台上的应用,其最初的版本是基于由乔布斯创建的 NeXT 公司所推出的 IDE 工具 Project Builder 而开发的。
5、2020 iOS面试题——UITableView & UICollection
- (1)UlCollectionView是iOS6新引进的API,用于展示集合视图,布局更加灵 活,其用法类似于 UITableView。而 UICollectio nView、
UICollectionViewCell与UITableView、UITableViewCell在用法上有相似的也 有不同的,下面是一些基本的使用方法:
对于 UITableView,仅需要 UITableViewDataSource,UITableViewDelegate 这 两个协议,使用 UICollectio nView 需要实现 UICollectio nViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout这三个协 议,这是因为 UICollectio nViewDelegateFlowLayout 实际上是 UICollectio nViewDelegate 的一个子协议,它继承 了
UICollectionViewDelegate,它的作用是提供一些定义UICollectionView布局 模式的函数
6、2020 iOS面试题——NSProxy & NSObject
- (1)NSObjetct:
NSObject协议组对所有的0bject - C下的objects都生效。如果objects遵从 该协议,就会被看作是first-class objects (一级类)。另外,遵从该协 议的objects的retain, release, autorelease等方法也服从objects的管理和 在Fou ndatio n中定义的释放方法。一些容器中的对象也可以管理这些 objects,比如说NSArray和NSDictionary定义的对象。Cocoa的根类也遵 循该协议,所以所有继承NSObjects的objects都有遵循该协议的特性。 NSProXY:
NSProxy是一个虚基类,它为一些表现的像是其它对象替身或者并不存在 的对象定义一套API。一般的,发送给代理的消息被转发给一个真实的对 象或者代理本身load(或者将本身转换成)一个真实的对象。NSProxy的基类 可以被用来透明的转发消息或者耗费巨大的对象的l azy初始化。
7、2020 iOS面试题——Object & Swift
- (1)Obejective-C复杂的语法,更加简单易用、有未来,让许多开发者心动不 已,Swift明显的特点有:
苹果宣称Swift的特点是:快速、现代、安全、互动,而且明显优于
Objective-C 语言
可以使用现有的Cocoa和Cocoa Touch框架
Swift取消了 Objective C的指针及其他不安全访问的使用
舍弃Objective C早期应用Smalltalk的语法,全面改为句点表示法提供了 类似Java的名字空间(namespace)、泛型(gen eric)、运算对象重载
(operator overloading) Swift 被简单的形容为"没有 C 的 Objective-
C”(Objective-C without the C)为苹果开发工具带来了Xcode
Playgrou nds功能,该功能提供强大的互动效果,能让Swift源代码在撰写 过程中实时显示出其运行结果;
基于C和O bjective-C,而却没有C的一些兼容约束;
采用了安全的编程模式;
界面基于Cocoa和Cocoa Touch框架;
保留了 Smalltalk的动态特性
8、2020 iOS面试题——传达通知&推送通知(本地&远程)
- (1)传值通知:类似通知,代理,Block实现值得传递
推送通知:推送到用户手机对应的App± (主要是不再前台的情况) 本地通知。
local notificatio n,用于基于时间行为的通知,比如有关日历或者todo列表 的小应用。另外,应用如果在后台执行,iOS允许它在受限的时间内运 行,它也会发现本地通知有用。比如,一个应用,在后台运行,向应用的 服务器端获取消息,当消息到达时,比如下载更新版本的提示消息,通过 本地通知机制通知用户。
本地通知是UILocalNotificatio n的实例,主要有三类属性:
scheduled time,时间周期,用来指定i OS系统发送通知的日期和时间; notification type,通知类型,包括警告信息、动作按钮的标题、应用图标 上的badge (数字标记)和播放的声音;
自定义数据,本地通知可以包含一个dictio nary类型的本地数据。
对本地通知的数量限制,OS最多允许最近本地通知数量是64个,超过限 制的本地通知将被iOS忽略。
远程通知(需要服务器)。
流程大概是这样的
1.生成 CertificateSig nin gRequest.certSig nin gRequest 文件
2.将 C ertificateSig nin gRequest.certSig nin gRequest 上传进 developer,导 出.cer文件
3利用CSR导出P12文件
4.需要准备下设备toke n值(无空格)
5.使用Ope nSSL合成服务器所使用的推送证书
—般使用极光推送,步骤是一样的,只是我们使用的服务器是极光的,不 需要自己大服务器!
9、2020 iOS面试题——第三方库
00 2020 iOS面试题——第三方平台
- (1)第三方库:一般是指大牛封装好的一个框架(库),或者第三方给我们提供 的一个库,这里比较笼统*第三方平台:指第三方提供的一些服务,其实 很多方面跟第三方库是一样的,但是还是存在一些区别。
区别:
库:AFN, ASI, Alomofire, MJRefresh, MJExtension, MBProgressHUD 平台:极光,百度,友盟,Mob,环信
imageName 和ImageWithContextOfFile 的区别?哪个性能高
⑴用imageNamed的方式加载时,图片使用完毕后缓存到内存中,内存 消耗多,加载速度快。即使生成的对象被autoReleasePool释放了,这份 缓存也不释放,如果图像比较大,或者图像比较多,用这种方式会消耗很 大的内存。
imageNamed采用了缓存机制,如果缓存中已加载了图片,直接从缓存读 就行了,每次就不用再去读文件了,效率会更高。
(2) ImageWithContextOfFile加载,图片是不会缓存的,加载速度慢。
(3) 大量使用imageNamed方式会在不需要缓存的地方额外增加开销CPU 的时间.当应用程序需要加载一张比较大的图片并且使用一次性,那么其实 是没有必要去缓存这个图片的,用imageWithCo nte ntsOfFile是最为经济的 方式,这样不会因为UIImage元素较多情况下,CPU会被逐个分散在不必要 缓存上浪费过多时间.
10、2020 iOS面试题——NSCache & NSDcitionary
- (1)NSCache与可变集合有几点不同:
NSCache类结合了各种自动删除策略,以确保不会占用过多的系统内存。 如果其它应用需要内存时,系统自动执行这些策略。当调用这些策略时, 会从缓存中删除一些对象,以最大限度减少内存的占用。
NSCache是线程安全的,我们可以在不同的线程中添加、删除和查询缓存 中的对象,而不需要锁定缓存区域。
不像NSMutableDictio nary对象,一个缓存对象不会拷贝key对象。
NSCache和NSDictio nary类似,不同的是系统回收内存的时候它会自动删 掉它的内容。
⑴可以存储(当然是使用内存)
⑵保持强应用,无视垃圾回收.=>这一点同NSMutableDictio nary
⑶有固定客户.
11、2020 iOS面试题—— UIView和setNeedsDisplay和setNeedsLayout方法
方法
- (1)1、 在 Mac OS 中 N SWi ndow 的父类是 NSRespo nder,而在 i OS 中
UIWi ndow的父类是UIVIew。程序一般只有一个窗口但是会又很多视图。
2、 UIView的作用:描画和动画,视图负责对其所属的矩形区域描画、布 局和子视图管理、事件处理、可以接收触摸事件、事件信息的载体、等 等。
3、 UIViewController负责创建其管理的视图及在低内存的时候将他们从内 存中移除。还为标准的系统行为进行响应。
4、 layOutSubViews可以在自己定制的视图中重载这个方法,用来调整子 视图的尺寸和位置。
5、 UIView的setNeedsDisplay(需要重新显示,绘制)和setNeedsLayout(需要 重新布局)方法。首先两个方法都是异步执行的。而setNeedsDispla y会调 用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurre ntCo ntext, 就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就可以处 理子视图中的一些数据。
综上所述:setNeedsDisplay方便绘图,而layoutSubViews方便出来数据 setNeedDisplay告知视图它发生了改变,需要重新绘制自身,就相当于刷 新界面.
12、2020 iOS面试题——UIView
>>>>2020 iOS面试题——UILayer
- (1)UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。它本 身完全是由CoreAnimation来实现的(Mac下似乎不是这样)。它真正的 绘图部分,是由一个叫CALayer (Core Animation Layer)的类来管理。
UIView本身,更像是一个C ALaye啲管理器,访问它的跟绘图和跟坐标有 关的属性,例如frame, bounds等等,实际上内部都是在访问它所包含的 CALaye啲相关属性。
UIView有个重要属性layer,可以返回它的主CALayer实例。
UIView的C ALayer类似UIView的子View树形结构,也可以向它的layer上添 加子layer,来完成某些特殊的表示。即CALayer层是可以嵌套的。
UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑树,这里 是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属 性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内 容。
动画的运作:对UIView的subLayer (非主Layer)属性进行更改,系统将自 动进行动画生成,动画持续时间的缺省值似乎是0.5秒。
坐标系统 :CALaye啲坐标系统比UIView多了一个anchorPoint属性,使用 CGPoi nt结构表示,值域是0〜1,是个比例值。
渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时, 可以调用setNeedsDispla y方法来重绘显示。
变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的transform 或 affi neTran sform 属性。
变形: Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像是三 维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。
CATra nsform3D的一套方法提供了一些魔术般的变换效果。
UIView 的 layer 树形在系统内部,被维护着三份 copy。
分别 shi 逻辑树:这里是代码可以操纵的;
动画树:是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;
显示树:其 内容就是当前正被显示在屏幕上得内容。
动画的运作:对 UIView 的 subLayer(非主 Layer)属性进行更改,
系统将自动进行动画生 成,动画持续时间的缺省值似乎是 0.5 秒。
坐标系统:CALayer 的坐标系统比 UIView 多了一个 anchorPoint 属性,
使用 CGPoint 结构 表示,值域是 0~1,是个比例值。
渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,
可以调用 setNeedsDisplay 方法来重绘显示。
变换:要在一个层中添加一个 3D 或仿射变换,可以分别设置层的 transform
或 affineTransform 属性。
变形:Quartz Core 的渲染能力,使二维图像可以被自由操纵,
就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,
缩放和倾斜。CATransform3D 的一套方法供了一 些魔术般的变换效果。
13、2020 iOS面试题—— layoutSubViews & drawRects
- (1)layoutSubviews在以下情况下会被调用(视图位置变化是触发):
1、 in it初始化不会触发layoutSubviews。
2、 addSubview会触发layoutSubviews。
3、 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前 后发生了变化。
4、 滚动一个 UIScrollView 会触发 l ayoutSubviews。
5、 旋转Scree n会触发父UIView上的layoutSubviews事件。
6、 改变一个UlView大小的时候也会触发父UlView上的layoutSubviews事 件。
7、 直接调用 setLayoutSubviews。
drawRect在以下情况下会被调用:
1、 如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自 动调用。drawRect 掉用是在Controller->loadView, Controller- >viewDidLoad两方法之后掉用的•所以不用担心在控制器中,这些View的 drawRect就开始画了 •这样可以在控制器中设置一些值给V iew(如果这些 View draw的时候需要用到某些变量值).
2、 该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出 size。然后系统自动调用drawRect:方法。
3、 通过设置 con te ntMode 属性值为 U IViewCo nte ntModeRedraw。那么将 在每次设置或更改frame的时候自动调用drawRect:。
4、 直接调用 setNeedsDisplay,或者 setNeedsDisplayl nRect:触发 drawRect:,但是有个前提条件是rect不能为0。
drawRect方法使用注意点:
1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef 并绘图。如果在其他方法中获取将获取到一个in validate的ref并且不能用于 画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或者setNeedsDisplayl nRect,让系统自动调该方法。
2、 若使用calayer绘图,只能在drawlnContext:中(类似鱼drawRect)绘 制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等 间接调用以上方法3、若要实时画图,不能使用gestureRecognizer,只能 使用touchbega n等方法来掉用setNeedsDispla y实时刷新屏幕
14、2020 iOS面试题——UDID & UUID
- (1)UDID是Unique Device Ide ntifier的缩写,中文意思是设备唯一标识.
在很多需要限制一台设备一个账号的应用中经常会用到,在Symbia n时代,我 们是使用IME作为设备的唯一标识的,可惜的是Apple官方不允许开发者获 得设备的IMEI.
[UIDevice currentDevice] uniqueIdentifier]
但是我们需要注意的一点是,对于已越狱了的设备,UDID并不是唯一的.使用 Cydia插件UDIDFaker,可以为每一个应用分配不同的U DID.所以UDID作为 标识唯一设备的用途已经不大了.
UUID是Un iversally Un ique Ide ntifier的缩写,中文意思是通用唯一识别码. 由网上资料显示,UUID是一个软件建构的标准,也是被开源软件基金会 (Ope n Software Fou ndatio n, OSF)的组织在分布式计算环境(Distributed Comput ing Env iro nme nt,DCE)领域的一部份.UUID的目的,是让分布式系统 中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识 资讯的指定.
15、 2020 iOS面试题—— CPU & GPU
- (1)CPU;中央处理器(英文Cen tral Processi ng Un it )是一台计算机的运算核 心和控制核心。CPU、内部存储器和输入/输出设备是电子计算机三大核心 部件。其功能主要是解释计算机指令以及处理计算机软件中的数据。
GPU;英文全称Graphic Process ing Unit,中文翻译为"图形处理器"。一个 专门的图形核心处理器。GPU是显示卡的“大脑”,决定了该显卡的档次和 大部分性能,同时也是2D显示卡和3D显示卡的区别依据。2D显示芯片在 处理3D图像和特效时主要依赖CPU的处理能力,称为“软加速”。3D显示芯 片是将三维图像和特效处理功能集中在显示芯片内,也即所谓的“硬件加 速”功能
区别:
CUP和GPU之所以大不相同,是由于其设计目的的不同,它们分别针对了两种不同的应用场景。CPU需要很强的通用性来处理各种不同的类型数据,同时又要逻辑判断又会引入大量的分支跳转和中断处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断纯净的计算环境。
关于绘图和动画有两种处理方法:CPU(中央处理器)和GPU(图形处理器)。在现代iOS设备中,都有可以运行不同软件的可编程芯片,但是由于历史原因,我们可以说CPU所做的工作都在软件层面,而GPU在硬件层面。
总的来说,我们可以用软件(使用CPU)做任何事情,但是对于图像处理,通常用硬件会更快,因为GPU使用图像对高度并行浮点运算做了优化。由于这些原因,我们想尽可能把屏幕渲染的工作交给硬件去处理。问题在于GPU并没有无限制处理性能,而且一旦资源用完的话,性能就会开始下降了(即使CPU并没有完全占用)
大多数动画性能优化都是关于智能利用GPU和CPU,使得它们都不会超出负荷。于是我们首先需要知道Core Animation是如何在两个处理器之间分配工作的。
16、 2020 iOS面试题—— 点(pt) &像素(px)
- (1)像素(pixels)是数码显示上最小的计算单位。在同一个屏幕尺寸,更高 的PPI (每英寸的像素数目),就能显示更多的像素,同时渲染的内容也 会更清晰。
点(points)是一个与分辨率无关的计算单位。根据屏幕的像素密度,一 个点可以包含多个像素(例如,在标准Reti na显示屏上1 pt里有2 x 2个像 素)。
当你为多种显示设备设计时,你应该以“点”为单位作参考,但设计还是以 像素为单位设计的。这意味着仍然需要以3种不同的分辨率导出你的素 材,不管你以哪种分辨率设计你的应用。
17、 2020 iOS面试题——属性与成员变量
- (1)像素(pixels)是数码显示上最小的计算单位。在同一个屏幕尺寸,更高 的PPI (每英寸的像素数目),就能显示更多的像素,同时渲染的内容也 会更清晰。
点(points)是一个与分辨率无关的计算单位。根据屏幕的像素密度,一 个点可以包含多个像素(例如,在标准Reti na显示屏上1 pt里有2 x 2个像 素)。
当你为多种显示设备设计时,你应该以“点”为单位作参考,但设计还是以 像素为单位设计的。这意味着仍然需要以3种不同的分辨率导出你的素 材,不管你以哪种分辨率设计你的应用。
18、2020 iOS面试题——int和NSInteger的区别
- SIn teger表示当前cpu下整型所占最大字节,不同C PU的lo ng型所占字节不 同,32 位 in t4 lon g4,64 位 in t4,lo ng8
(1)import和include
import可以避免重复包含
(2)@class
避免循环引用头文件
(3)全局&静态变量
全局变量和静态变量的区别
1>修饰符
全局变量在声明源文件之外使用,需要exter n引用一下;
静态变量使用static来修饰
2>存储地址
两者都是存储在静态存储区,非堆栈上,它们与局部变量的存储分开
3>生命周期
两者都是在程序编译或加载时由系统自动分配的,程序结束时消亡
4>外部可访问性
全局变量在整个程序的任何地方均可访问,而静态变量相当于面向对象中的 私有变量,他的可访问性只限定于声明它的那个源文件,即作用于仅局限于 本文件中
19、2020 iOS面试题——类和对象
- (1)1.category
⑴分类拓展协议中哪些可以声明属性
都可以,但分类和协议创建的属性只相当于方法,但是内部没有对成员变量 的操作(无法创建成员变量),拓展可以(私有成员变量)
代理中声明属性,没有实际创建成员变量,相当于声明了属性名对应的访问 方法,遵守协议的类需要实现对应的访问器方法,否则运行报错
分类中声明属性,警告提示需要手动实现访问器方法(Swift中叫计算型属性), 而分类中不能创建成员变量,可以在手写访问器方法中使用run time的 objc_setAssociatedObject方法关联对象间接创建属性(静态库添加属性) 拓展里可以声明属性,直接可以使用
(2) 继承和类别的区别
1>使用继承:
1.1>添加新方法和父类方法一致,但父类方法仍需要使用
1.2>添加新属性
2>类别:
2.1 >针对系统提供的一些类,系统本身不提倡继承,因为这些类的内部实现 对继承有所限制(NSStri ng ini tWithFormat继承崩溃)
2.2>类别可以将自己构建的类中的方法进行分组,对于大型的类,提高可维 护性
(3) 分类的作用
将类的实现分散到多个不同文件或多个不同框架中。
创建对私有方法的前向引用。
向对象添加非正式协议。
徘正式协议:即NSObject的分类,声明方法可以不实现,OC2.O以前protocal 没有@optio nal,主要使用分类添加可选协议方法
oc中声明方法不实现,不调用则只警告不报错
正式协议的优点:可继承,泛型约束
如kvo的observeValueForKeyPath属于n sobject的分类,且不需要调父类,说 明可选实现该方法,没警告可能是编译器规则过滤)
(4) 分类的局限性
无法向类中添加新的实例变量,类别没有位置容纳实例变量。
名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的 优先级。类别方法将完全取代初始方法从而无法再使用初始方法。
无法添加实例变量的局限可以使用字典对象解决。
2.extension
3.protocol
20、2020 iOS面试题—— category & extension
- (1)类别主要有三个作用
⑴可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管 理。也可以对框架提供类的扩展(没有源码,不能修改)。
⑵创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其 他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不 必提供方法实现),编译器就不会再产生警告
⑶向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正 式协议”,因为可以作为任何类的委托对象使用。
他们的主要区别是:
1、 形式上来看,extension是匿名的categoryo
2、 extension里声明的方法需要在mainimplementation中实现,category不 强制要求。
3、 extension可以添加属性(变量),category不可以。
Category和Exte nsio n都是用来给已定义的类增加新的内容的。
Category和原有类的耦合更低一些,声明和实现都可以写在单独的文件 里。但是只能为已定义类增加M ethod,而不能加入in sta nee variable o Exte nsio n耦合比较高,声明可以单独写,但是实现必须写在原有类的 @impleme ntatio n中。可以增加 M ethod 和 in sta nee variable o
Exte nsio n给人感觉更像是在编写类时为了封装之类的特性而设计,和类是 同时编写的。而category则是在用到某一个framework中的类时临时增加的 特性。
Exte nsio n 的一个特性就是可以 redeclare—个 in sta nee variable,将之从 reado nly 改为对内 readwrite.
使用Exten sio n可以更好的封装类,在h文件中能看到的都是对外的接口, 其余的in sta nee variable和对内的@propert y等都可以写在Exte nsio n,这样 类的结构更加清晰。
21、 2020 iOS面试题—— Foundation
- (1)⑴字符串
1>字符串比较
NSString *a = @“hello”;
NSString *b = [NSString stringWithFormat:@hello”];
if (a == b){ nslog(@“a==b”); }
if ([a isEqualToString: b]){
nslog(@“a isEqualToString b”); }
==比较变量中保存的数值(地址)速度快内容同,可能地址不同(常量区,堆 区)
isEqualTo比较字符串非常耗时
(2) 字符串截取
截取字符串"20 | http://www.baidu.com"中,字符前面和后面的数据,分别 输出它们。
NSString * str = @"20 | [http://www.baidu.com](http://www.baidu.com)";
NSArray *array = [str componentsSeparatedByString:@"|"]; //这是 分别输出的截取后的字符串
for (int i = 0; i<[array count]; ++i) { NSLog(@"%d=%@",i,[array objectAtIndex:i]);
(3) 格式
<p>NSString *str1 = [NSString stringWithFormat:@<q>a</q>b”];
//报错,a”后加b非法<br/>
NSString *str2 = [NSString stringWithFormat:@“a"<q>b”];
//显示 ab<br/>
NSString *str3 = [NSString stringWithFormat:@"a\v/q>b"]; //显 示 a"b 反斜杠转义</p>
22、2020 iOS面试题——NSArray和NSDictionary
- (1) iOS遍历数细字典的方法
数组:for 循环 for in en umerateObjectsUs in gBlock(正序)
en umerateObjectsWithOptio ns:us in gBlock:(多一个遍历选项,不保证顺序) 字典:
1.for(NSString object in [testDic allValues])
2.for(id akey in [testDic allKeys]){
[sum appendString:[testDic objectForKey:akey]]; }
3.[testDic enumerateKeysAndObjectsUsingBlock:dkey,idobj,BOOLstop) {
[sum appendString:obj]; } ];
速度:对于数组,增强for最快,普通for和block速度差不多,增强最快是因为增 强for语法会对容器里的元素的内存地址建立缓冲,遍历的时候直接从缓冲 中取元素地址而不是通过调用方法来获取,所以效率高.这也是使用增强for 时不能在循环体中修改容器元素的原因之一(可以在循环体中添加标记,在 循环体外修改元素)
对于字典,allValues最快,alKe y和block差不多,原因是allKe y需要做 objcetForKey 的方法
(2)NSValue NSNumber
1>归档视图尺寸,坐标
(3)其它
nil Nil n ull NSNull 的区别
(4)如何避免循环引用
两个对象相互强引用,都无法release,解决办法为一个使用stro ng,—个 使用 assign (weak)
需要更多iOS面试文集资料,加iOS技术交流群:196800191,群文件直接获取
23、 2020 iOS面试题——CFSocket使用有哪几个步骤
- (1)答:创建Socket的上下文;创建Socket ;配置要访问的服务器信息;封 装服务器信息;连接服务器;
24、 2020 iOS面试题—— Core Foundation中提供了哪几种操作Socket的 方法?
- (1)答:CFNetwork、CFSocket 和 BSD Socket o
25、2020 iOS面试题—— 解析XML文件有哪几种方式?
- (1)答:以DOM方式解析XML文件;以SAX方式解析XML文件;
26、 2020 iOS面试题—— 什么是沙盒模型?哪些操作是属于私有api范畴?
- (1)答:某个iph one工程进行文件操作有此工程对应的指定的位置,不能逾 越。
iphone沙箱模型的有四个文件夹documents, tmp, app, Library,永久数
据存储一般放docume nts文件夹,得到模拟器的路径的可使用 NSHomeDirectoryO方法。Nsuserdefaults保存的文件在tmp文件夹里。
27、2020 iOS面试题—— 在一个对象的方法里面:self・name= “object”****;和name =”object”有什么不同吗?
- (1)答:self.name —'object":会调用对象的setNameO方法; name = “object”:会直接把object赋值给当前对象的name属性。
28、2020 iOS面试题—— 请简要说明 viewDidLoad 和 viewDidUnload 何时 调用
- (1)答:viewDidLoad在view从nib文件初始化时调用,loadView在controller的 view为nil时调用。此方法在编程实现view时调用,view控制器默认会注册 memory warning no tificatio n, 当 v iew co ntroller 的任何 view 没有用的时候, viewDidU nload会被调用,在这里实现将retai n的view release,如果是retain 的IBOutlet view属性则不要在这里release, IBOutlet会负责release。
29、2020 iOS面试题—— 创建控制器、视图的方式
- (1)
30、2020 iOS面试题——简述内存分区情况
- (1)代码区:存放函数二进制代码
2) .数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放 全局变量、静态变量、常量
3) .堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动 申请和释放
4) .栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、 函数参数
31、2020 iOS面试题—— 队列和栈有什么区别
- (1)答:队列和栈是两种不同的数据容器。从”数据结构”的角度看,它们都是 线性结构,即数据元素之间的关系相同。
队列是一种先进先出的数据结构,它在两端进行操作,一端进行入队列操 作,一端进行出列队操作。
栈是一种先进后出的数据结构,它只能在栈顶进行操作,入栈和出栈都在 栈顶操作。
32、2020 iOS面试题—— iOS的系统架构
- (1)答:iOS的系统架构分为(核心操作系统层theCore OS layer )、(核心 服务层theCore Services layer )x(媒体层 theMedia layer )和(Cocoa 界面服务层the Cocoa Touch layer )四个层次。
33、 2020 iOS面试题—— 控件主要响应3种事件
- (1)答:1).基于触摸的事件;2).基于值的事件;3).基于编辑的事件。
34、 2020 iOS面试题——xib文件的构成分为哪3个图标?都具有什么功能
- (1)答:File's Owner是所有nib文件中的每个图标,它表示从磁盘加载nib 文件的对象;
First Respo nder就是用户当前正在与之交互的对象;
View显示用户界面;完成用户交互;是UIView类或其子类。
35、 2020 iOS面试题—— 简述视图控件器的生命周期
- (1)
36、2020 iOS面试题——app项目的生命周期
- (1) 应用的生命周期
各个程序运行状态时代理的回调: -(BOOL)application:(UIApplication)application willFinishLaunchingWithOptions:(NSDictionary)launchOptions* 告诉代理进 程启动但还没进入状态保存
-(BOOL)application:(UIApplication)application
didFi nishLau nchi ngWithOptio ns:(NSDictio nary *)la un chOptio ns 告诉代理启 动基本完成程序准备开始运行
-(void)applicationWillResignActive:(UIApplication *)application 当应用程序 将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来 电话了
-(void)applicationDidBecomeActive:(UIApplication *)application 当应用程序 入活动状态执行,这个刚好跟上面那个方法相反
-(void)applicationDidEnterBackground:(UIApplication *)application 当程序 被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面 设置即可
-(void)applicationWillEnterForeground:(UIApplication *)application 当程序从 后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
-(void)applicationWillTerminate:(UIApplication *)application 当程序将要退出 是被调用,通常是用来保存数据和一些退出前的清理工作。
(2) 简要说明一下 APP 的启动过程, main 文件说起, main 函数中有什么 函数?作用是什么?
打开程序 > 执行main函数 >UIAPPlicationMain函数 > 初始
化UIAPPlicationMain函数(设置代理,开启事件循环) > 监听系统事件
—>程序结束
先执行main函数,main内部会调用UIApplicationMain函数
(3) UIApplicationMain 函数作用
⑴、根据传入的第三个参数创建UIApplicati on对象或它的子类对象。如果 该参数为nil,直接使用该UIApplication来创建。(该参数只能传人 UIApplicatio n或者是它的子类)
⑵、根据传入的第四个参数创建AppDelegate对象,并将该对象赋值给第1 步创建的UIApplicatio n对象的delegate属性。
⑶、开启一个事件循环,循环监控应用程序发生的事件。每监听到对应的系 统事件时,就会通知AppDelegate。
(4) main函数作用*
⑴创建UIApplicatio n对象
(2) 创建应用程序代理
(3) 开启时间循环,包括应用程序的循环运行,并开始处理用户事件。
37、 2020 iOS面试题——动画有基本类型有哪几种;表视图有哪几种基本 样式。
- (1)答:动画有两种基本类型:隐式动画和显式动画。
38、 2020 iOS面试题—— 实现简单的表格显示需要设置UlTableView的什么 属性、实现什么协议?
- (1)答:实现简单的表格显示需要设置UITableView的dataSource和delegate 属性,实现 UITableViewDataSource 和 UITableViewDelegate 协议。
39、 2020 iOS面试题—— Cocoa Touch提供了哪几种Core Animation过渡 类型?
- (1)答:Cocoa Touch提供了 4种Core Animation过渡类型,分别为:交叉 淡化、推挤、显示和覆盖。
过渡动画通过 type 设置不同的动画效果, CATransition 有多种过渡效果, 但其实 Apple 官方的SDK只提供了四种:
fade 淡出 默认
moveIn 覆盖原图
push 推出
reveal 底部显示出来
但私有API提供了其他很多非常炫的过渡动画,如 cube(立方旋转)、suckEffect(吸走)、oglFlip(水平翻转 沿y轴)、 rippleEffect(滴水效果)、pageCurl(卷曲翻页 向上翻页)、pageUnCurl(卷曲翻页 向下翻页)、cameraIrisHollowOpen(相机开启)、cameraIrisHollowClose(相机关闭)等。
注: 因 Apple 不提供维护,并且有可能造成你的app审核不通过, 所以不建议开发者们使用这些私有API.
40、2020 iOS面试题—— UIView与CLayer有什么区别?
1).UIView是OS系统中界面元素的基础,所有的界面元素都是继承自
它。它本身完全是由CoreA nimation来实现的。它真正的绘图部分,是由 一个CALayer类来管理。UIView本身更像是一个CALayer的管理器,访 问它的跟绘图和跟坐标有关的属性。
2).UIView有个重要属性layer ,可以返回它的主CALayer实例。
3).UIView的CALayer类似UIView的子View树形结构,也可以向它的 layer上添加子layer ,来完成某些特殊的表示。即CALayer层是可以嵌套 的。
4).UIView的layer树形在系统内部,被维护着三份copy。分别是逻辑
树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上 更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕 上得内容。
5).动画的运作:对UIView的subLayer (非主Layer )属性进行更改,系 统将自动进行动画生成,动画持续时间的缺省值似乎是0.5秒。
6).坐标系统:CALayer的坐标系统比UIView多了一个anchorPoint属
性,使用C GPoi nt结构表示,值域是0〜1,是个比例值。这个点是各种图 形变换的坐标原点,同时会更改layer的positio n的位置,它的缺省值是 {0.5,0.5},即在 layer 的中央。
7).渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好 时,可以调用setNeedsDisplay方法来重绘显示。
8).变换:要在一个层中添加一个3D或仿射变换,可以分别设置层的 tran sform 或 affi neTra nsform 属性。
9).变形:Quartz Core的渲染能力,使二维图像可以被自由操纵,就好像 是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾 斜。CATransform3D的一套方法提供了一些魔术般的变换效果。
41、2020 iOS面试题——Quatrz 2D的绘图功能的三个核心概念是什么并简
答:上下文:主要用于描述图形写入哪里;
路径:是在图层上绘制的内容;
状态:用于保存配置变换的值、填充和轮廓,alpha值等。
42、2020 iOS面试题—— iPhone OS主要提供了几种播放音频的方法?
答:SystemSound Services
AVAudioPlayer 类
Audio Queue Services
OpenAL
43、 2020 iOS面试题—— 使用AVAudioPlayer类调用哪个框架、使用步骤?
答:AVFoundation .framework
步骤:配置AVAudioPlayer对象;
实现AVAudioPlayer类的委托方法;
控制AVAudioPlayer类的对象;
监控音量水平;
回放进度和拖拽播放。
44、2020 iOS面试题—— 有哪几种手势通知方法、写清楚方法名?
答:
-(void)touchesBegan:(NSSet)touchedwithEvent:(UIEvent)event;
-(void)touchesMoved:(NSSet)touched withEvent:(UIEvent)event;
-(void)touchesEnded:(NSSet)touchedwithEvent:(UIEvent)event;
-(void)touchesCanceled:(NSSet)touchedwithEvent:(UIEvent)event;
-(void)touchesBegan:(NSSet)touchedwithEvent:(UIEvent)event;
-(void)touchesMoved:(NSSet)touched withEvent:(UIEvent)event;
-(void)touchesCanceled:(NSSet)touchedwithEvent:(UIEvent)event;
45、2020 iOS面试题—— ViewController的didReceiveMemoryWarning怎 么被调用
答:[super didReceiveMemoryWar nin g];
当程序接到内存警告时View Controller将会收到这个消息:didReceiveMemoryWarning
1、当程序收到内存警告时候ViewController会调用didReceiveMemoryWarning这个方法。
2、调用了这个方法之后,对view进行释放并且调用viewDidUnload方法
3、从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。
46、2020 iOS面试题—— 什么时候用delegate,什么时候用N otification?
答:delegate针对on e-to-o ne关系,用于se nder接受到recieve啲某个功能反 馈值。
no tificati on 针对on e-to-on e/ma ny/non e,reciver,用于通知多个 o bject 某个事 件。
大家都知道delegate和notification都是为了在不同的对象之间传递数据,下面简单介绍一下两者:
delegate针对one-to-one关系,并且reciever可以返回值给sender,nofication可以针对one-to-one/amny/noe,reciever无法返回值给sender.所以,delegate用于sender希望接收到reciever某个功能反馈值,nofication用于通知多个object某个事件。
那么何时该使用delegate,何时该使用notification呢?
1.参数的不同
使用delegate参数更加直观,使用notification参数不那么直观,所以能使用delegate的地方,尽量使用delegate
2.传递的长度
有时候你的页面会一次跳好几个页面,那么你想把这个页面的数据传回到底层是很麻烦的事情,因为你要把delegate指针从底层界面一直传上来。
3.传递多个数据
当你在同一个对象传递给多个对象,用delegate就不可行了。
47、 2020 iOS面试题—— 用预处理指令#define声明一个常数,用以表明1年 中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:
define语法的基本知识(例如:不能以分号结束,括号的使用,等
等)
懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算
—年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L, 告诉编译器这个常数是的长整型数。
如果你在你的表达式中用到UL (表示无符号长整型),那么你有了一个好 的起点。记住,第一印象很重要。
48、 2020 iOS面试题—— 写一个”标准"宏MIN ,这个宏输入两个参数并返回 较小的一个。
# define MIN(A,B) (A) <= (B) ? (A) : (B))
# define MIN(A,B) (A) <= (B) ? (A) : (B))
这个测试是为下面的目的而设的:
标识#defi ne在宏中应用的基本知识。这是很重要的,因为直到嵌入(in li ne) 操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方 法,
对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方 法。
三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器 能产生比if-the n-else更优化的代码,了解这个用法是很重要的。
懂得在宏中小心地把参数用括号括起来
我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生 什么事?
least = MIN(p++, b);
least = MIN(p++, b);
结果是:
((p++) <= (b) ? (p++) : (p++))
((p++) <= (b) ? (p++) : (p++))
这个表达式会产生副作用,指针p会作三次++自增操作。
49、2020 iOS面试题——关键字const有什么含意?修饰类呢?static的作用, 用于类呢?还有extern c的作用
- (1)const意味着11只读",下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改 的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数 是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的 整型数是不可修改的,同时指针也是不可修改的)。
结论:
关键字con st的作用是为给读你代码的人传达非常有用的信息,实际上, 声明一个参数为常量是为了告诉了用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多 余的信息。(当然,懂得用con st的程序员很少会留下的垃圾让别人来清 理的)通过给优化器一些附加的信息,使用关键字con st也许能产生更紧 凑的代码。合理地使用关键字con st可以使编译器很自然地保护那些不希 望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少 bug的出现。
(1) .欲阻止一个变量被改变,可以使用const关键字。在定义该const变量 时,通常需要对它进行初
始化,因为以后就没有机会再去改变它了;
(2) .对指针来说,可以指定指针本身为con st,也可以指定指针所指的数据 为con st,或二者同时指
定为con st;
(3) .在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在 函数内部不能改变其值;
(4) .对于类的成员函数,若指定其为const类型,则表明其是一个常函数, 不能修改类的成员变量;
(5) .对于类的成员函数,有时候必须指定其返回值为const类型,以使得其 返回值不为“左值”。
50、2020 iOS面试题——关键字volatile有什么含意?并给出三个不同的例 子
- (1)答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这 样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到 这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在 寄存器里的备份。
下面是volatile变量的几个例子:
并行设备的硬件寄存器(如:状态寄存器)
一个中断服务子程序中会访问到的非自动变量(No n-automatic variables) 多线程应用中被几个任务共享的变量
51、2020 iOS面试题—— 一个参数既可以是const还可以是volatile吗?一 个指针可以是volatile吗?
- (1)答:是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意 想不到地改变。它是con st因为程序不应该试图去修改它。
(2).是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指 向一个buffe啲指针时。
52、 2020 iOS面试题—— static关键字的作用
- (1)答:
1).函数体内static变量的作用范围为该函数体,不同于auto变量,该变 量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值;
2).在模块内的static全局变量可以被模块内所用函数访问,但不能被模块 外其它函数访问;
3).在模块内的static函数只可被这一模块内的其它函数调用,这个函数的 使用范围被限制在声明
它的模块内;
4).在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份 拷贝;
5).在类中的static成员函数属于整个类所拥有,这个函数不接收this指 针,因而只能访问类的static成员变量。
53、 2020 iOS面试题—— 列举几种进程的同步机制,并比较其优缺点。
- (1)答:原子操作信号量机制自旋锁管程,会合,分布式系统
54、2020 iOS面试题——进程之间通信的途径
- (1)答:共享存储系统消息传递系统管道:以文件系统为基础
55、2020 iOS面试题—— 进程死锁的原因
- (1)答:资源竞争及进程推进顺序非法
56、 2020 iOS面试题——死锁的4个必要条件
- (1)答:互斥、请求保持、不可剥夺、环路
57、2020 iOS面试题—— 死锁的处理
- (1)答:鸵鸟策略、预防策略、避免策略、检测与解除死锁
58、 2020 iOS面试题——cocoa touch框架
答:iPhone OS应用程序的基础Cocoa Touch框架重用了许多Mac系统 的成熟模式,但是它更多地专注于触摸的接口和优化。
UIKit为您提供了在iPho ne OS上实现图形,事件驱动程序的基本工具, 其建立在和Mac OS X中一样的Fou ndation框架上,包括文件处理,网 络,字符串操作等。
Cocoa Touch具有和iPho ne用户接口一致的特殊设计。有了 UIKit,您可 以使用iPho ne OS上的独特的图形接口控件,按钮,以及全屏视图的功 能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架除了UIKit夕卜,Cocoa Touch包含了创建世界一流iPhone 应用程序需要的所有框架,从三维图形,到专业音效,甚至提供设备访问 API以控制摄像头,或通过GPS获知当前位置。
Cocoa Touch既包含只需要几行代码就可以完成全部任务的强大的 Objective-C框架,也在需要时提供基础的C语言API来直接访问系统。 这些框架包括:
Core An imation :通过Core An imati on,您就可以通过一个基于组合独立 图层的简单的编程模型来创建丰富的用户体验。
Core Audio: Core Audio是播放,处理和录制音频的专业技术,能够轻松 为您的应用程序添加强大的音频功能。
Core Data:提供了一个面向对象的数据管理解决方案,它易于使用和理 解,甚至可处理任何应用或大或小的数据模型。
功能列表:框架分类
下面是Cocoa Touch中一小部分可用的框架:
音频和视频:Core Audio , OpenAL , Media Library , AV Foundation
数据管理:Core Data , SQLite
图形和动画:Core Animation , OpenGL ES , Quartz 2D
网络:Bonjour , WebKit , BSD Sockets
用户应用:Address Book , Core Location , Map Kit , Store Kit
59、 2020 iOS面试题—— 自动释放池是什么,如何工作
- (1)答:当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的 —个引用放入到最新的自动释放.它仍然是个正当的对象,因此自动释放池 定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束 的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
60、 2020 iOS面试题—— sprintf,strcpy,memcpy使用上有什么要注意的地 方
- (1). spri ntf是格式化函数。将一段数据通过特定的格式,格式化到一个字符 串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字 符串会超出缓冲区的大小,造成溢出。
2).strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char *src
将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为 ‘\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容 易出错。
3). memcpy是具备字符串拷贝功能的函数,这是一个内存拷贝函数,它的 函数原型为memcpy(char dst, const char src, unsigned int len);将长度为len 的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存 叠加的问题。
61、2020 iOS面试题—— 你了解svn,cvs等版本控制工具么?
- (1)答:版本控制svn,cvs是两种版控制的器,需要配套相关的svn, cvs服务
口 口
scm是xcode里配置版本控制的地方。版本控制的原理就是a和b同时开发
—个项目,a写完当天的代码之后把代码提交给服务器,b要做的时候先从 服务器得到最新版本,就可以接着做。如果a和b都要提交给服务器,并且 同时修改了同一个方法,就会产生代码冲突,如果a先提交,那么b提交 时,服务器可以提示冲突的代码,b可以清晰的看到,并做出相应的修改 或融合后再提交到服务器。
62、2020 iOS面试题—— 什么是push
- (1)答:客户端程序留下后门端口,客户端总是监听针对这个后门的请求,于 是服务器可以主动像这个端口推送消息。
63、2020 iOS面试题—— 静态链接库
- (1)答:此为.a文件,相当于java里的jar包,把一些类编译到一个包中,在不 同的工程中如果导入此文件就可以使用里面的类,具体使用依然是#import “ xx.h”。
64、2020 iOS面试题—— 0C三大特性
- (1)(1) 封装—点语法
1>本质
〃以下代码有什么问题
- (void)setName:(NSString *)name {
self.name = name;
}
- (NSString *)name {
return self.name;
}
点语法的本质是调用类的getter方法和setter方法,如果类中没有getter方 法和setter方法就不能使用点语法。
(2) 继承
1>如何实现多重继承
消息转发
forwardingTargetForSelector methodSignatureForSelector forwardInvocation delegate 和 protocol
类别
http://www.cocoachina.com/ios/20130528/6295.html
⑶多态
1>什么是多态
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
由于每个类都属于该类的名字空间,这使得多态称为可能。类定义中的名 字和类定义外的名字并不会冲突。类的实例变量和类方法有如下特点: •和C语言中结构体中的数据成员一样,类的实例变量也位于该类独有的 名字空间。
•类方法也同样位于该类独有的名字空间。与C语言中的方法名不同,类 的方法名并不是一个全局符号。一个类中的方法名不会和其他类中同样的 方法名冲突。两个完全不同的类可以实现同一个方法。
方法名是对象接口的一部分。对象收到的消息的名字就是调用的方法的名 字。因为不同的对象可以有同名的方法,所以对象必须能理解消息的含 义。同样的消息发给不同的对象,导致的操作并不相同。
多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯 性的命名,而不用为每一个新加的函数命名一个新名字。这样,编程接口 就是一些抽象的行为的集合,从而和实现接口的类区分开来。
Objective-C支持方法名的多态,但不支持参数和操作符的多态。
65、2020 iOS面试题——0C中如何实现多态
- (1)在Objective-C中是通过一个叫做selector的选取器实现的。在O bjective-C 中,selector有两个意思,当用在给对象的源码消息时,用来指方法的名 字。它也指那个在源码编译后代替方法名的唯一的标识符。编译后的选择 器的类型是SEL有同样名字的方法、也有同样的选择器。你可以使用选择 器来调用一个对象的方法。
选取器有以下特点:
*所有同名的方法拥有同样的选取器
*所有的选取器都是不一样的
⑴SEL和@selector
选择器的类型是SEL。@selector指示符用来引用选择器,返回类型是
SEL。
例如:
SEL responseSEL; responseSEL = @selector(loadDataForTableView:);
可以通过字符串来得到选取器,例如:
responseSEL = NSSelectorFromString(@"loadDataForTableView:");
也可以通过反向转换,得到方法名,例如:
NSString *methodName = NSStringFromSelector(responseSEL);
⑵方法和选取器
选取器确定的是方法名,而不是方法实现。这是多态性和动态绑定的基 础,它使得向不同类对象发送相同的消息成为现实;否则,发送消息和标 准C中调用方法就没有区别,也就不可能支持多态性和动态绑定。
另外,同一个类的同名类方法和实例方法拥有相同的选取器。
⑶方法返回值和参数类型
消息机制通过选取器找到方法的返回值类型和参数类型,因此,动态绑定 (例:向id定义的对象发送消息)需要同名方法的实现拥有相同返回值类 型和相同的参数类型;否则,运行时可能出现找不到对应方法的错误。 有一个例外,虽然同名类方法和实例方法拥有相同的选取器,但是它们可 以有不同的参数类型和返回值类型。
<3•动态绑定
66、2020 iOS面试题——Objective-C的优缺点
- 答:objc优点:
(1). Cateogies
(2). Posing
(3).动态识别
(4).指标计算
(5).弹性讯息传递
(6).不是一个过度复杂的C衍生语言
(7).Objective-C与C++可混合编程
objc缺点:
(1).不支援命名空间
(2).不支持运算符重载
(3).不支持多重继承
(4).使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化 方法都用不到。(如内联函数等),性能低劣。
67、2020 iOS面试题—— 对于0C,你认为最大的优点和最大的不足是什么? 对于不足之处,现在有没有可用的方法绕过这些不足来 实现需求。如果可以话,有没有考虑或者实现过重新实 现0C的功能,如果有,具体怎么做?
- (1)最大的优点是它的运行时特性,不足是没有命名空间,对于命名冲突,可 以使用长命名法或特殊前缀解决,如果是引入的第三方库之间的命名冲 突,可以使用link命令及flag解决冲突。
68、2020 iOS面试题—— oc中可修改和不可以修改类型
- (1)答:可修改不可修改的集合类,这个我个人简单理解就是可动态添加修改 和不可动态添加修改一样。比如NSArra y和NSMutableArray,前者在初始 化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的 内存空间。
69、2020 iOS面试题—— 我们说的oc是动态运行时语言是什么意思?
- (1)答:多态。主要是将数据类型的确定由编译时,推迟到了运行时。这个问 题其实浅涉及到两个概念,运行时和多态。
简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及 调用该类别对象指定方法。
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
意思就是假设生物类(life)都用有一个相同的方法-eat。那人类属于生物,猪 也属于生物,都继承了 life后,实现各自的eat,但是调用是我们只需调用 各自的eat方法。也就是不同的对象以自己的方式响应了相同的消息(响应 了 eat这个选择器)。因此也可以说,运行时机制是多态的基础?〜〜〜
70、2020 iOS面试题—— 通知和协议的不同之处?
- (1)答:协议有控制链(has-a)的关系,通知没有。
首先我一开始也不太明白,什么叫控制链(专业术语了〜)。但是简单分析下 通知和代理的行为模式,我们大致可以有自己的理解
简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受 者。
代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济 代理人,很多时候一个经济人负责好几个明星的事务。
只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能 说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别 称B的发布会了。但是通知就不一样,他只关心发出通知,而不关心多少 接收到感兴趣要处理。
因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关 系。
1.通知:
通知需要有一个通知中心:NSNotificationCenter,自定义通知的话需要给一个名字,然后监听。
优点:通知的发送者和接受者都不需要知道对方。可以指定接收通知的具体方法。通知名可以是任何字符串。
缺点:较键值观察(KVO)需要多点代码,在删掉前必须移除监听者。
2.协议
通过setDelegate来设置代理对象,最典型的例子是常用的TableView.
优点:支持它的类有详尽和具体信息。
缺点:该类必须支持委托。某一时间只能有一个委托连接到某一对象。
71、 2020 iOS面试题—— 什么是推送消息?
- (1)答:推送通知更是一种技术,简单点就是客户端获取资源的一种手段。 普通情况下,都是客户端主动的pull。推送则是服务器端主动push。
72、2020 iOS面试题—— 关于多态性
答:多态,子类指针可以赋值给父类。
这个题目其实可以出到一切面向对象语言中,因此关于多态,继承和封装 基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出 来。
73、2020 iOS面试题—— 什么是谓词?
- (1)答:谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完 成对数据的筛选。
predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];
a = [customers filteredArrayUsingPredicate:predicate];
predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n]; a = [customers filteredArrayUsingPredicate:predicate];
74、2020 iOS面试题—— 做过的项目是否涉及网络访问功能,使用什么对象 完成网络功能?
- (1)答:ASIHTTPRequest与NSURLConnection
75、 2020 iOS面试题—— 简单介绍下N SURLConnection类及 +sendSynchronousRequest:returningResponse:error: 与-initWithRequest:delegate :两个方法的应别?
- (1)答:NSURLCo nn ectio n主要用于网络访问,其中+ sendSyn chro nousRequest:retur nin gRespo nse:error :是同步访问数据,即当 前线程会阻塞,并等待request的返回的respo nse,而-
in itWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通 过delegate回到主线程,并其委托的对象。
76、 2020 iOS面试题——谈谈Object-C的内存管理方式及过程?
+答: (1).当你使用n ew,alloc和copy方法创建一个对象时,该对象的保留计数器 值为1.当你不再使用该对象时,你要负责向该对象发送一条release或 autorelease消息.这样,该对象将在使用寿命结束时被销毁.
(2).当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为 1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清 理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成 时释放它.
(3).如果你保留了某个对象,你需要(最终)释放或自动释放该对象.必须保持 reta in方法和release方法的使用次数相等.
77、 2020 iOS面试题—— Object-C有私有方法吗?私有变量呢?
- (1)答:objective-c -类里面的方法只有两种,静态方法和实例方法.这似乎就 不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西.如 果没有了私有方法的话,对于一些小范围的代码重用就不那么顺手了.在类 里面声名一个私有方法
@interface Controller : NSObject {
NSString *something;
} - (void)thisIsAStaticMethod;
一 (void)thislsA nln sta nceMethod; @end
@interface Controller (private)
-(void)thisIsAPrivateMethod;
@end
@interface Controller : NSObject {
NSString *something;
} - (void)thisIsAStaticMethod;
一 (void)thisIsA nIn sta nceMethod;
@end
@interface Controller (private)
-(void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在Objective-C中,所有实例变量默认都是私有的,所有实例方法默认都是 公有的
78、2020 iOS面试题——说说响应链
- (1)答:事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至 下,或者从下之上传播。
可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。 因为问的太抽象化了,严重怀疑题目出到越后面就越笼统。
可以从责任链模式,来讲通过事件响应链处理,其拥有的扩展性。
描述响应者链条
当触摸事件发生时,压力转为电信号,iOS系统将产生UIEve nt对象,记录事件 产生的时间和类型,然后系统将事件加入到一个由UIApplicati on管理的事件 队列中。
UIApplicatio n会从事件队列中取出最前面的事件,并将事件分发下去以便 处理,通常,先发送事件给应用程序的主窗口( keyW in dow) 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件(从父到 子,从后到前),这也是整个事件处理过程的第一步
找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事 件处理
79、2020 iOS面试题——时间传递&响应者链 事件的产生和传递过程:
- (1)1.发生触摸事件后,系统会将该事件加入到一个由UIApplicati on管理的队 列事件中
2.UIApplicati on会从事件队列中取出最前面的事件,并将事件分发下去以 便处理,通常会先发送事件给应用程序的主窗口 (keyW in dow)
3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件
4.找到合适的视图控件后,就会调用视图控件的touches方法来作事件的具 体处理:touchesBegin... touchesMoved...touchesEnded等
5.这些touches方法默认的做法是将事件顺着响应者链条向上传递,将事件 叫个上一个相应者进行处理
—般事件的传递是从父控件传递到子控件的
如果父控件接受不到触摸事件,那么子控件就不可能接收到触摸事件
80、2020 iOS面试题—— frame和bounds有什么不同?
- (1)答:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父 亲的坐标系统)
bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身 坐标系统)
81、2020 iOS面试题—— 方法和选择器有何不同?
- (1)答:selector是一个方法的名字,method是一个组合体,包含了名字和实 现,详情可以看apple文档。
82、 2020 iOS面试题—— OC的垃圾回收机制?
- (1)答:OC2.0有Garbage collection,但是iOS平台不提供。
一般我们了解的o bjective-c对于内存管理都是手动操作的,但是也有自动 释放池。
但是差了大部分资料,貌似不要和arc机制搞混就好了。
83、2020 iOS面试题—— 什么是延迟加载?
- (1)答:懒汉模式,只在用到的时候才去初始化,也可以理解成延时加载。 我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。一个 延时载,避免内存过高,一个异步加载,避免线程堵塞。
84、 2020 iOS面试题—— 是否在一个视图控制器中嵌入两个tableview控制 器?
- (1)答:一个视图控制只提供了一个View视图,理论上一个tableViewCo ntroller 也不能放吧,只能说可以嵌入一个tableview视图。当然,题目本身也有歧 义如果不是我们定性思维认为的UIViewCo ntroller,而是宏观的表示视图 控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图 控制器,比如TabbarCo ntroller那样的感觉。
85、 2020 iOS面试题——一个tableView是否可以关联两个不同的数据源? 你会怎么处理?
>>>>UITableView 需要关联不同的数据源来回切换,自定义cell,导致数据重叠?怎么结决?
- (1)答:首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的 代理方法里实现的。
因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据 自己的需要去设置如相关的数据源。
因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛 呢?想让列表如何显示,不同的数据源分区块显示?
86、2020 iOS面试题—— 什么时候使用NSMutableArray,什么时候使用 NSArray?
>>>>关于NSMutableArray线程安全的思考和实现
- (1)答:当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数 组在初始化后,便不再改变的,使用NSArray。需要指出的是,使用 NSArra y只表明的是该数组在运行时不发生改变,即不能往N SAarry的数组 里新增和删除元素,但不表明其数组內的元素的内容不能发生改变。 NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到 NSMutableArra y 需要注意。
87、2020 iOS面试题——给出委托方法的实例,并且说出UlTableVlew的Data Source方法
- (1)答:CocoaTouch框架中用到了大量委托,其中UIkbleViewDelegate就是 委托机制的典型应用,是一个典型的使用委托来实现适配器模式,其中 UITableViewDelegate协议是目标,tableview是适配器,实现 UITableViewDelegate协议,并将自身设置为talbeview的delegate的对象, 是被适配器,一般情况下该对象是UITableViewCo ntroller。
UITableVIew 的 Data Source 方法有
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section;
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section;
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
最后欢迎加入我的iOS交流圈资料获取:
分享内容包括逆向安防、算法、架构设计、多线程,网络进阶,还有底层、音视频、Flutter等等......
+裙:196800191或者是+ WX(XiAZHiGardenia)免费获取! 获取面试资料 一起交流技术
> 若有不准确的地方,欢迎评论指出。同时若是有好的题目或者文章也希望大家可以再评论区分享讨论,小编会时刻关注大家的评论及时精选和顶置的哦~共同学习,互相勉励!
同时也感谢各位看官踊跃发言~