从基础到进阶、底层的188道iOS面试题,上篇(1-87)


'写给读者的话👇'
这些是我对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 的一套方法􏰀供了一 些魔术般的变换效果。


132020 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实时刷新屏幕

142020 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的目的,是让分布式系统 中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识 资讯的指定.
152020 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是如何在两个处理器之间分配工作的。

162020 iOS面试题—— 点(pt) &像素(px)
  • (1)像素(pixels)是数码显示上最小的计算单位。在同一个屏幕尺寸,更高 的PPI (每英寸的像素数目),就能显示更多的像素,同时渲染的内容也 会更清晰。
    点(points)是一个与分辨率无关的计算单位。根据屏幕的像素密度,一 个点可以包含多个像素(例如,在标准Reti na显示屏上1 pt里有2 x 2个像 素)。
    当你为多种显示设备设计时,你应该以“点”为单位作参考,但设计还是以 像素为单位设计的。这意味着仍然需要以3种不同的分辨率导出你的素 材,不管你以哪种分辨率设计你的应用。

172020 iOS面试题——属性与成员变量
  • (1)像素(pixels)是数码显示上最小的计算单位。在同一个屏幕尺寸,更高 的PPI (每英寸的像素数目),就能显示更多的像素,同时渲染的内容也 会更清晰。
    点(points)是一个与分辨率无关的计算单位。根据屏幕的像素密度,一 个点可以包含多个像素(例如,在标准Reti na显示屏上1 pt里有2 x 2个像 素)。
    当你为多种显示设备设计时,你应该以“点”为单位作参考,但设计还是以 像素为单位设计的。这意味着仍然需要以3种不同的分辨率导出你的素 材,不管你以哪种分辨率设计你的应用。

182020 iOS面试题——intNSInteger的区别
  • 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>外部可访问性
    全局变量在整个程序的任何地方均可访问,而静态变量相当于面向对象中的 私有变量,他的可访问性只限定于声明它的那个源文件,即作用于仅局限于 本文件中

192020 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

202020 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,这样 类的结构更加清晰。

212020 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>

222020 iOS面试题——NSArrayNSDictionary
  • (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,群文件直接获取

群内资料分享

学习书籍

面试宝典


232020 iOS面试题——CFSocket使用有哪几个步骤
  • (1)答:创建Socket的上下文;创建Socket ;配置要访问的服务器信息;封 装服务器信息;连接服务器;

242020 iOS面试题—— Core Foundation中提供了哪几种操作Socket的 方法?
  • (1)答:CFNetwork、CFSocket 和 BSD Socket o

252020 iOS面试题—— 解析XML文件有哪几种方式?
  • (1)答:以DOM方式解析XML文件;以SAX方式解析XML文件;

262020 iOS面试题—— 什么是沙盒模型?哪些操作是属于私有api范畴?
  • (1)答:某个iph one工程进行文件操作有此工程对应的指定的位置,不能逾 越。
    iphone沙箱模型的有四个文件夹documents, tmp, app, Library,永久数
    据存储一般放docume nts文件夹,得到模拟器的路径的可使用 NSHomeDirectoryO方法。Nsuserdefaults保存的文件在tmp文件夹里。

272020 iOS面试题—— 在一个对象的方法里面:selfname= “object”****;name =”object”有什么不同吗?
  • (1)答:self.name —'object":会调用对象的setNameO方法; name = “object”:会直接把object赋值给当前对象的name属性。

282020 iOS面试题—— 请简要说明 viewDidLoadviewDidUnload 何时 调用
  • (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。

292020 iOS面试题—— 创建控制器、视图的方式
  • (1)

302020 iOS面试题——简述内存分区情况
  • (1)代码区:存放函数二进制代码
    2) .数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放 全局变量、静态变量、常量
    3) .堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动 申请和释放
    4) .栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、 函数参数

312020 iOS面试题—— 队列和栈有什么区别
  • (1)答:队列和栈是两种不同的数据容器。从”数据结构”的角度看,它们都是 线性结构,即数据元素之间的关系相同。
    队列是一种先进先出的数据结构,它在两端进行操作,一端进行入队列操 作,一端进行出列队操作。
    栈是一种先进后出的数据结构,它只能在栈顶进行操作,入栈和出栈都在 栈顶操作。

322020 iOS面试题—— iOS的系统架构
  • (1)答:iOS的系统架构分为(核心操作系统层theCore OS layer )、(核心 服务层theCore Services layer )x(媒体层 theMedia layer )和(Cocoa 界面服务层the Cocoa Touch layer )四个层次。

332020 iOS面试题—— 控件主要响应3种事件
  • (1)答:1).基于触摸的事件;2).基于值的事件;3).基于编辑的事件。

342020 iOS面试题——xib文件的构成分为哪3个图标?都具有什么功能
  • (1)答:File's Owner是所有nib文件中的每个图标,它表示从磁盘加载nib 文件的对象;
    First Respo nder就是用户当前正在与之交互的对象;
    View显示用户界面;完成用户交互;是UIView类或其子类。

352020 iOS面试题—— 简述视图控件器的生命周期
  • (1)

362020 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 函数中有什么 函数?作用是什么?

app完整的启动过程 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) 开启时间循环,包括应用程序的循环运行,并开始处理用户事件。


372020 iOS面试题——动画有基本类型有哪几种;表视图有哪几种基本 样式。
  • (1)答:动画有两种基本类型:隐式动画和显式动画。

382020 iOS面试题—— 实现简单的表格显示需要设置UlTableView的什么 属性、实现什么协议?
  • (1)答:实现简单的表格显示需要设置UITableView的dataSource和delegate 属性,实现 UITableViewDataSource 和 UITableViewDelegate 协议。

392020 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.


402020 iOS面试题—— UIViewCLayer有什么区别?

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的一套方法提供了一些魔术般的变换效果。


412020 iOS面试题——Quatrz 2D的绘图功能的三个核心概念是什么并简

答:上下文:主要用于描述图形写入哪里;
路径:是在图层上绘制的内容;
状态:用于保存配置变换的值、填充和轮廓,alpha值等。


422020 iOS面试题—— iPhone OS主要提供了几种播放音频的方法?

答:SystemSound Services
AVAudioPlayer 类
Audio Queue Services
OpenAL


432020 iOS面试题—— 使用AVAudioPlayer类调用哪个框架、使用步骤?

答:AVFoundation .framework
步骤:配置AVAudioPlayer对象;
实现AVAudioPlayer类的委托方法;
控制AVAudioPlayer类的对象;
监控音量水平;
回放进度和拖拽播放。


442020 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;

452020 iOS面试题—— ViewControllerdidReceiveMemoryWarning怎 么被调用

答:[super didReceiveMemoryWar nin g];
当程序接到内存警告时View Controller将会收到这个消息:didReceiveMemoryWarning

1、当程序收到内存警告时候ViewController会调用didReceiveMemoryWarning这个方法。

2、调用了这个方法之后,对view进行释放并且调用viewDidUnload方法

3、从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。


462020 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就不可行了。


472020 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 (表示无符号长整型),那么你有了一个好 的起点。记住,第一印象很重要。


482020 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会作三次++自增操作。


492020 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类型,以使得其 返回值不为“左值”。

502020 iOS面试题——关键字volatile有什么含意?并给出三个不同的例 子
  • (1)答:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这 样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到 这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在 寄存器里的备份。
    下面是volatile变量的几个例子:
    并行设备的硬件寄存器(如:状态寄存器)
    一个中断服务子程序中会访问到的非自动变量(No n-automatic variables) 多线程应用中被几个任务共享的变量

512020 iOS面试题—— 一个参数既可以是const还可以是volatile吗?一 个指针可以是volatile吗?
  • (1)答:是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意 想不到地改变。它是con st因为程序不应该试图去修改它。
    (2).是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指 向一个buffe啲指针时。

522020 iOS面试题—— static关键字的作用
  • (1)答:
    1).函数体内static变量的作用范围为该函数体,不同于auto变量,该变 量的内存只被分配一次,
    因此其值在下次调用时仍维持上次的值;
    2).在模块内的static全局变量可以被模块内所用函数访问,但不能被模块 外其它函数访问;
    3).在模块内的static函数只可被这一模块内的其它函数调用,这个函数的 使用范围被限制在声明
    它的模块内;
    4).在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份 拷贝;
    5).在类中的static成员函数属于整个类所拥有,这个函数不接收this指 针,因而只能访问类的static成员变量。

532020 iOS面试题—— 列举几种进程的同步机制,并比较其优缺点。
  • (1)答:原子操作信号量机制自旋锁管程,会合,分布式系统

542020 iOS面试题——进程之间通信的途径
  • (1)答:共享存储系统消息传递系统管道:以文件系统为基础

552020 iOS面试题—— 进程死锁的原因
  • (1)答:资源竞争及进程推进顺序非法

562020 iOS面试题——死锁的4个必要条件
  • (1)答:互斥、请求保持、不可剥夺、环路

572020 iOS面试题—— 死锁的处理
  • (1)答:鸵鸟策略、预防策略、避免策略、检测与解除死锁

582020 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


592020 iOS面试题—— 自动释放池是什么,如何工作
  • (1)答:当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的 —个引用放入到最新的自动释放.它仍然是个正当的对象,因此自动释放池 定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束 的位置时,自动释放池就会被释放,池中的所有对象也就被释放。

602020 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中去,这个函数的长度可控。但是会有内存 叠加的问题。

612020 iOS面试题—— 你了解svn,cvs等版本控制工具么?
  • (1)答:版本控制svn,cvs是两种版控制的器,需要配套相关的svn, cvs服务
    口 口
    scm是xcode里配置版本控制的地方。版本控制的原理就是a和b同时开发
    —个项目,a写完当天的代码之后把代码提交给服务器,b要做的时候先从 服务器得到最新版本,就可以接着做。如果a和b都要提交给服务器,并且 同时修改了同一个方法,就会产生代码冲突,如果a先提交,那么b提交 时,服务器可以提示冲突的代码,b可以清晰的看到,并做出相应的修改 或融合后再提交到服务器。

622020 iOS面试题—— 什么是push
  • (1)答:客户端程序留下后门端口,客户端总是监听针对这个后门的请求,于 是服务器可以主动像这个端口推送消息。

632020 iOS面试题—— 静态链接库
  • (1)答:此为.a文件,相当于java里的jar包,把一些类编译到一个包中,在不 同的工程中如果导入此文件就可以使用里面的类,具体使用依然是#import “ xx.h”。

642020 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支持方法名的多态,但不支持参数和操作符的多态。


652020 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•动态绑定

662020 iOS面试题——Objective-C的优缺点
  • 答:objc优点:
    (1). Cateogies
    (2). Posing
    (3).动态识别
    (4).指标计算
    (5).弹性讯息传递
    (6).不是一个过度复杂的C衍生语言
    (7).Objective-C与C++可混合编程
    objc缺点:
    (1).不支援命名空间
    (2).不支持运算符重载
    (3).不支持多重继承
    (4).使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化 方法都用不到。(如内联函数等),性能低劣。

672020 iOS面试题—— 对于0C,你认为最大的优点和最大的不足是什么? 对于不足之处,现在有没有可用的方法绕过这些不足来 实现需求。如果可以话,有没有考虑或者实现过重新实 现0C的功能,如果有,具体怎么做?
  • (1)最大的优点是它的运行时特性,不足是没有命名空间,对于命名冲突,可 以使用长命名法或特殊前缀解决,如果是引入的第三方库之间的命名冲 突,可以使用link命令及flag解决冲突。

682020 iOS面试题—— oc中可修改和不可以修改类型
  • (1)答:可修改不可修改的集合类,这个我个人简单理解就是可动态添加修改 和不可动态添加修改一样。比如NSArra y和NSMutableArray,前者在初始 化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的 内存空间。

692020 iOS面试题—— 我们说的oc是动态运行时语言是什么意思?
  • (1)答:多态。主要是将数据类型的确定由编译时,推迟到了运行时。这个问 题其实浅涉及到两个概念,运行时和多态。
    简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及 调用该类别对象指定方法。
    多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
    意思就是假设生物类(life)都用有一个相同的方法-eat。那人类属于生物,猪 也属于生物,都继承了 life后,实现各自的eat,但是调用是我们只需调用 各自的eat方法。也就是不同的对象以自己的方式响应了相同的消息(响应 了 eat这个选择器)。因此也可以说,运行时机制是多态的基础?〜〜〜

702020 iOS面试题—— 通知和协议的不同之处?
  • (1)答:协议有控制链(has-a)的关系,通知没有。
    首先我一开始也不太明白,什么叫控制链(专业术语了〜)。但是简单分析下 通知和代理的行为模式,我们大致可以有自己的理解
    简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受 者。
    代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济 代理人,很多时候一个经济人负责好几个明星的事务。
    只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能 说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别 称B的发布会了。但是通知就不一样,他只关心发出通知,而不关心多少 接收到感兴趣要处理。
    因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关 系。

1.通知:
通知需要有一个通知中心:NSNotificationCenter,自定义通知的话需要给一个名字,然后监听。
优点:通知的发送者和接受者都不需要知道对方。可以指定接收通知的具体方法。通知名可以是任何字符串。
缺点:较键值观察(KVO)需要多点代码,在删掉前必须移除监听者。
2.协议
通过setDelegate来设置代理对象,最典型的例子是常用的TableView.
优点:支持它的类有详尽和具体信息。
缺点:该类必须支持委托。某一时间只能有一个委托连接到某一对象。


712020 iOS面试题—— 什么是推送消息?
  • (1)答:推送通知更是一种技术,简单点就是客户端获取资源的一种手段。 普通情况下,都是客户端主动的pull。推送则是服务器端主动push。

722020 iOS面试题—— 关于多态性

答:多态,子类指针可以赋值给父类。
这个题目其实可以出到一切面向对象语言中,因此关于多态,继承和封装 基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出 来。


732020 iOS面试题—— 什么是谓词?
  • (1)答:谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完 成对数据的筛选。
    predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];
    a = [customers filteredArrayUsingPredicate:predicate];
    predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n]; a = [customers filteredArrayUsingPredicate:predicate];

742020 iOS面试题—— 做过的项目是否涉及网络访问功能,使用什么对象 完成网络功能?
  • (1)答:ASIHTTPRequest与NSURLConnection

752020 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回到主线程,并其委托的对象。

762020 iOS面试题——谈谈Object-C的内存管理方式及过程?

+答: (1).当你使用n ew,alloc和copy方法创建一个对象时,该对象的保留计数器 值为1.当你不再使用该对象时,你要负责向该对象发送一条release或 autorelease消息.这样,该对象将在使用寿命结束时被销毁.
(2).当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为 1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清 理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成 时释放它.
(3).如果你保留了某个对象,你需要(最终)释放或自动释放该对象.必须保持 reta in方法和release方法的使用次数相等.


772020 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中,所有实例变量默认都是私有的,所有实例方法默认都是 公有的

782020 iOS面试题——说说响应链
  • (1)答:事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至 下,或者从下之上传播。
    可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。 因为问的太抽象化了,严重怀疑题目出到越后面就越笼统。
    可以从责任链模式,来讲通过事件响应链处理,其拥有的扩展性。
    描述响应者链条
    当触摸事件发生时,压力转为电信号,iOS系统将产生UIEve nt对象,记录事件 产生的时间和类型,然后系统将事件加入到一个由UIApplicati on管理的事件 队列中。
    UIApplicatio n会从事件队列中取出最前面的事件,并将事件分发下去以便 处理,通常,先发送事件给应用程序的主窗口( keyW in dow) 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件(从父到 子,从后到前),这也是整个事件处理过程的第一步
    找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事 件处理

792020 iOS面试题——时间传递&响应者链 事件的产生和传递过程:
  • (1)1.发生触摸事件后,系统会将该事件加入到一个由UIApplicati on管理的队 列事件中
    2.UIApplicati on会从事件队列中取出最前面的事件,并将事件分发下去以 便处理,通常会先发送事件给应用程序的主窗口 (keyW in dow)
    3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件
    4.找到合适的视图控件后,就会调用视图控件的touches方法来作事件的具 体处理:touchesBegin... touchesMoved...touchesEnded等
    5.这些touches方法默认的做法是将事件顺着响应者链条向上传递,将事件 叫个上一个相应者进行处理
    —般事件的传递是从父控件传递到子控件的
    如果父控件接受不到触摸事件,那么子控件就不可能接收到触摸事件

802020 iOS面试题—— framebounds有什么不同?
  • (1)答:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父 亲的坐标系统)
    bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身 坐标系统)

812020 iOS面试题—— 方法和选择器有何不同?
  • (1)答:selector是一个方法的名字,method是一个组合体,包含了名字和实 现,详情可以看apple文档。

822020 iOS面试题—— OC的垃圾回收机制?
  • (1)答:OC2.0有Garbage collection,但是iOS平台不提供。
    一般我们了解的o bjective-c对于内存管理都是手动操作的,但是也有自动 释放池。
    但是差了大部分资料,貌似不要和arc机制搞混就好了。

832020 iOS面试题—— 什么是延迟加载?
  • (1)答:懒汉模式,只在用到的时候才去初始化,也可以理解成延时加载。 我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。一个 延时载,避免内存过高,一个异步加载,避免线程堵塞。

842020 iOS面试题—— 是否在一个视图控制器中嵌入两个tableview控制 器?
  • (1)答:一个视图控制只提供了一个View视图,理论上一个tableViewCo ntroller 也不能放吧,只能说可以嵌入一个tableview视图。当然,题目本身也有歧 义如果不是我们定性思维认为的UIViewCo ntroller,而是宏观的表示视图 控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图 控制器,比如TabbarCo ntroller那样的感觉。

852020 iOS面试题——一个tableView是否可以关联两个不同的数据源? 你会怎么处理?
>>>>UITableView 需要关联不同的数据源来回切换,自定义cell,导致数据重叠?怎么结决?
  • (1)答:首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的 代理方法里实现的。
    因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据 自己的需要去设置如相关的数据源。
    因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛 呢?想让列表如何显示,不同的数据源分区块显示?

862020 iOS面试题—— 什么时候使用NSMutableArray,什么时候使用 NSArray?
>>>>关于NSMutableArray线程安全的思考和实现
  • (1)答:当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数 组在初始化后,便不再改变的,使用NSArray。需要指出的是,使用 NSArra y只表明的是该数组在运行时不发生改变,即不能往N SAarry的数组 里新增和删除元素,但不表明其数组內的元素的内容不能发生改变。 NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到 NSMutableArra y 需要注意。

872020 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)免费获取! 获取面试资料 一起交流技术

> 若有不准确的地方,欢迎评论指出。同时若是有好的题目或者文章也希望大家可以再评论区分享讨论,小编会时刻关注大家的评论及时精选和顶置的哦~共同学习,互相勉励!

同时也感谢各位看官踊跃发言~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容