iOS面试知识点梳理

article/2025/9/13 17:52:53

1.iOS开发者账号类型

  • “个人”开发者可以申请升级“公司”,可以通过拨打苹果公司客服电话(400 6701 855)来咨询和办理。
  • 公司账号允许多个开发者进行协作开发,比个人多一些帐号管理的设置,可设置多个Apple ID,分4种管理级别的权限。申请公司账号需要填写公司的邓白氏编码(DUNS Number)。
  • 需要注意的是,企业账号开发的应用不能上线App Store,适合那些不希望公开发布应用的企业。同样,申请时也需要公司的邓白氏编码(DUNS Number)。

2.Property属性

1.原子性:nonatomic 、atomic
2.读写: readwrite 、readonly
3.方法名:getter=<name>、setter=<name>
4.内存:strong、retain、copy、weak、assign 、unsafe_unretained

atomic:原子性,只有一个线程可以同时访问实例。atomic 是线程安全的,至少在当前的读取器是安全的。虽然它是一个默认属性,但是由于其使用同步锁开销较大,会损耗性能。
nonatomic:非原子性的,可以被多个线程访问。效率要比atomic 高,但是不能保证其在多线程状态下的安全性,在单线程和明确只有一个线程访问的情况下被广泛使用。

readwrite(默认值):表示其同时拥有getter 和 setter 方法;
readonly:只读操作,其只有getter 方法,没有setter法
注:如果某个实例只允许被外部读取,而不能写入操作,同时在类实现文件当中可以写入的话,可以在头文件中声明属性为只读的,在实现文件中设置其为可读写的属性,写法如下:

//头文件中声明为:
@property(nonatomic,readonly,copy) NSString *stringA; //实现文件中声明为: @property(nonatomic,readwrite,copy) NSString *stringA;

getter=<name>的样式:
@property (nonatomic, getter=isOn) BOOL on;

 

assign:用于值类型(如int,float等)
weak: 用于修饰引用类型
unsafe_unretained:只修饰引用类型
区别:

  1. 三者修饰效果相同,即都不会更改所赋新值的引用计数,也不改变旧值的引用计数
  2. assign一般只修饰值类型,虽然也可以修饰引用类型,但是修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。
  3. weak 不会产生野指针问题。因为weak修饰的对象释放后(引用计数器值为0),指针会自动被置nil,之后再向该对象发消息也不会崩溃。 weak是安全的。
  4. unsafe_unretained与assign的区别在于,其只修饰引用类型。

strong:用于引用类型,强引用。
retain :用于引用类型,强引用。
copy:修饰属性会在内存里拷贝对象。
区别:

  1. 三者都用于修饰引用类型。
  2. strong用于ARC,retain用于MRC。
  3. copy分为浅层复制和深复制两种,NSString、NSArray、NSDictionary等不可变类型都为浅层复制,即其引用计数会+1,而不会创建新的内存。

 

3.了解沙盒的目录结构

iOS应用沙盒即文件系统目录,与其他应用的文件系统隔离

 

  • Documents:保存应用运行时生成的需要持久化的数据,如游戏进度、涂鸦软件的绘图等信息, 该目录会被iTunes同步备份。

  • Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据,如缓存图片或者离线数据(地图等)。

  • Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录。

  • tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。重新手机、系统磁盘不足时都会被清理

4.理解内存中的区域划分

栈区(stack):由系统自动分配和释放,存放局部变量的值,容量小速度快,有序
:一般由程序员分配和释放,如果不释放,则出现内存泄露。程序会回收您的内存,特点:容量大,速度慢,无序
静态存储区:全局变量(外部变量)和静态变量都存放在静态区域。当程序结束使,系统回收
常量区:存放常量的内存区域,程序结束时,系统回收
代码区:存放二进制代码的区域

5.理解iOS的远程推送

简易推送流程:


(1) 应用程序安装后提示用户是否需要接收推送,用户确认后注册消息推送。
(2)App接收到从APNS Server获取的令牌信息;
(3)APP将令牌信息发送到自己的服务器端;
(4)当需要向用户推送消息时,自己的服务器将向苹果的推送通知服务器(Apple Push Notification Service,以下简称 APNS)发送通知;
(5)APNS 会向装有此APP的iPhone设备发送消息

第三方推送的原理(以个推为例):

6.理解Block的使用

  1. Block为什么要用copy
    a、block在创建的时候默认分配的内存是在栈上,而不是在堆上。这样的话其本身的作用域是属于创建时候
    的作用域,一旦在创建的作用域之外调用就会导致程序的崩溃。所以使用了copy将其拷贝到堆内存上。
    b、block创建在栈上,而block的代码中可能会用到本地的一些变量,只有将其拷贝到堆上,才能用这些变量

  2. Block为什么不用retain
    retain这是增加了一次计数,block的内存还是在栈上,并没有存在堆上,存在栈上的block可能随时被系统回收。

  3. 为什么进入block中的对象引用计数需要自动加1
    Block执行的是回调,因此block并不知道其中的对象obj创建后会在什么时候被释放,为了不在block使用obj之前,对象已经被释放,block就retain了obj一次

  4. block和函数的关系
    Block的使用很像函数指针,不过与函数最大的不同是Block可以访问函数以外、词法作用域以内的外部变量的值。
    换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境。

  5. 对于block的理解
    block实际上是: 指向结构体的指针
    编译器会将block的内部代码生成对应的函数

  6. 对于基本数据类型,进入到block中会被当做常量处理

  //如果需要在block中对num进行修改,需要加上关键字__block
  //(我们也可以用static关键字进行修饰)
  int num1 = 10;
  void(^block1)() = ^{ NSLog(@"num1 is %d",num1); };
  num1 = 20; block1(); //输出10
  //改进:使用block,使进入到block块中的变量不被当做常量来使用
  __blockint num2 = 10;
  void(^block2)() = ^{ NSLog(@"num2 is %d",num2);
  };
  num2 = 20; block2(); //输出20
7.Block中self的循环引用
  block默认创建在栈上,所以对要对其进行执行copy操作,将其拷贝到堆区,便于更好的操作对象。但是执行了copy操作之后,block中使用self,此对象会被retain一次(注意:block在堆区上时才会起到retain作用),会造成循环引用。
  解决方法:
  在MRC下,使用__block修饰
  在ARC下,使用__unsafe_unretained\weak修饰

7.理解循环引用出现的三种情况:

  1. NSTimer
    NSTimer对象timer作为一个对象A的属性,本意在A的dealloc中释放timer,但是timer没有停止就不会触发dealloc,然后就互相等待,造成循环引用。解决方法是显式的调用timer的关闭方法[timer invaluate],再释放A对象

  2. Block
    block代码块没有配合weak使用

  3. Delegate
    声明delegate时请用assign(MRC)或者weak(ARC)。

  循环引用举例:

NSMutableArray *firstArray = [NSMutableArray array]; 
NSMutableArray *secondArray = [NSMutableArray array];
[firstArray addObject:secondArray]; 
[secondArray addObject:firstArray]; 

检测循环引用
Xcode -> Product -> Pofile -> Leaks

8.理解指针的使用

用变量a给出下面的定义原文链接
a) 一个整型数
b) 一个指向整型数的指针
c) 一个指向指针的的指针,它指向的指针是指向一个整型数
d) 一个有10个整型数的数组
e) 一个有10个指针的数组,该指针是指向一个整型数的
f) 一个指向有10个整型数数组的指针
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

9、理解iOS中的多线程

1.概念理解:
多线程是针对于单核的CPU来设计的,目的是为了让CPU快速在多个线程之间进行调度。
多线程的优缺点
优点:提高程序的执行效率
缺点:开启线程需要一定的内存空间

同步和异步:决定了可不可以开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力

并行与串行:决定了任务的执行方式
并行:多个任务并发(同时)执行。类型迅雷,多个任务同时开启下载
串行:一个任务执行完毕后,再执行下一个任务。类似浏览器的一个接一个下载

iOS应用程序中都是一个主线程,也成为UI线程
那么主线程的作用就是用来更新UI,显示或者刷新界面
注意:不能将耗时的任务放在主线程上,否则会出现卡顿的现象。

 

2.iOS的三种多线程编程技术
NSThread
直接操作线程对象,但需要手动管理生命周期,而且经常使用这种方式来查看当前线程
GCD(Grand Central Dispatch)
底层使用的是C语言,灵活方便,可以根据系统负荷来增减线程,性能效率更好
Cocoa NSOperation
NSOperation对GCD的封装,使用起来更好理解,将任务封装为NSOpertaion,添加到NSOPerationQueue对象中
子类化NSOpertaion的设计,更具有面向对象(封装,复用)的特性。更加适合在复杂项目中使用

3.进程与线程
Progress和Thread,进程和线程是操作系统里的基本概念
线程与进程的区别:
线程是资源分配的最小单位,也是处理器调度的基本单位,但是进程不是
进程是资源拥有的单位,同一个进程内的线程共享进程里的资源
多进程,允许多个任务同时运行
多线程,允许单个任务分为不同的部分运行

10.了解音频播放相关知识

音频的播放从形式上分为音频播放和音乐播放。
音频播放:通常时间较短,不需要进度控制,和循环控制。使用AudioToolbox.framework。
音乐播放:通常时间较长,需要进行精准控制。使用AVFoundation.framework。

音频播放
AudioToolbox.framework是基于C语言的框架。
原理:将短音频注册的到系统声音服务(System Sound Service)中。System Sound Service是一种简单、底层的声音播放服务。
1.音频播放时间不能超过30秒。
2.数据必须是PCM或者IMA4格式。
3.音频格式必须打包成.caf、.aif、wav中的一种。(这是官方说法,实际发现一些.mp3也可以)。

音乐播放
1.适合播放较大的音频。
2.可以对音频进行精准的播放控制
3.使用AVFoundataion.framework中的AVAudioPlayer来实现。
使用:
1.初始化AVAudioPlayer对象,通常是指定本地文件路径
2.设置播放器属性,例如重复次数,音量大小等。
3.调用play方法播放。

注意:AVAudioPlayer一次只能播放一个音频文件,所有的上一曲和下一曲都是通过创建多个AVAudioPlayer来实现的。

 

11.了解视频播放相关知识

Apple已经为我们提供了多种方法来实现视频播放,包括MPMoviePlayerController,MPMoviePlayerViewController,AVPlayer,AVPlayerViewController等。而值得注意的是,上述的MPMoviePlayerController与MPMoviePlayerViewController在iOS9.0之后被弃用。下面是四种播放方式的区别:

11.理解OC中的反射机制
  1. class反射:通过类名字符串实例化对象
Class class = NSClassFromString(@“Student”);
Student *student = [[class alloc] init];
  1. 类名转化为字符串
Class class = [student class];
NSString *calssName = NSStringFromClass(class); 
  1. SEL的反射
SEL selector = =NSSelectorFromClass(@“setName”);
[stu performSelector:selector withObject:nil];
  1. 通过方法字符串形式实例化方法
 NSStringFromSelector(@selector *( “setName:”));

12.理解一个对象被创建需要的三个步骤

开辟内存空间
初始化参数
返回内存地址值

 

13.layoutSubView何时调用

1、 初始化方法事不会调用
2、滚动UIScrollview触发
3、旋转屏幕时触发
4、改变View的值时候触发,前提是frame改变了
5、改变UIView的大小时触发

14.理解NSOperationQueue

NSOperationQueue是存放NSOPeration的集合类,可以参考JAVA中的线程和线程池的概念。
虽说是queue,但并不是队列的意思,并不遵守先进先出。
所以我们可以理解为Pool ,即线程池。

15.理解OC是动态运行时语言

OC将数据、对象类型的确定从编译阶段推迟到了运行时。实现这一操作的基础是面向对象语言的多态特性。
这里面有有两个关键字:运行时和多态
运行时:运行时机制使我们知道运行的时候才确定一个对象的类型、以及调用该类别对象指定的方法。
多态:不同的对象以自己的方式来响应相同的消息。子类的指针可以赋值给父类。

16.GCD的queue、main queue中执行的代码一定是在main thread么?

queue中所执行的代码不一定在main thread中。如果queue是在主线程中创建的,那么所执行的代码就是在主线程中执行。如果是在子线程中创建的,那么就不会在main thread中执行。
上述说法并不完全正确,queue中所执行的代码不一定在主线程是对的,但是队列Queue中执行的任务是在否在主线程与创建队列所在的线程并无关系。

对于这个问题,首先总结几个知识点:
1.iOS中获取队列的三种方式:
主线程队列
主线程队列为串行队列,和主线程绑定。同普通串行队列一样,队列中任务一次只能执行一个,但是队列中所有任务都在主线程中执行(经过测试,即使是异步添加的任务,也没有创建新的线程)。

全局队列
系统全局队列为并发队列,根据不同的优先级(HIGH、DEFAULT、LOW、BACKGROUND)有四个。

自定义队列
系统提供方法,可以自定义创建串行和并行队列。

2.同步与异步,串行与并行
同步与异步:决定可不可以开启新的线程
同步:在当前线程立即执行添加的任务,不具备开启新线程的能力。
异步:在新的线程中执行任务,具备开启新线程的能力

并行与串行:决定了任务的执行方式
并行:可以多个任务并发(同时)执行。类型迅雷,多个任务同时开启下载
串行:一个任务执行完毕后,再执行下一个任务。类似浏览器的一个接一个下载

对于这个问题,我使用 代码测试了使用的情况如下:

 

总结:队列Queue中执行的任务是在否在主线程与创建队列所在的线程无关。

判断一个任务是不是在主线程,我们可以首先判断同步还是异步,因为异步才具有开启新线程的能力。然而我们还需要注意两点:
1.主线程所在队列为串行队列,添加同步会导致死锁。
2.并非所有的异步任务都不在主线程中,主线程队列中添加异步任务,并不开启新的线程。

 

17.常见的Http状态码有哪些?

302是请求重定向。
500及以上是服务器错误,如503表示服务器找不到、3840表示服务器返回无效JSON。
400及以上是请求链接错误或者找不到服务器,如常见的404。
200及以上是正确,如常见的是200表示请求正常。
更多参考: Http状态码详细说明

 

18.Runloop和线程的关系?

19.什么是消息转发机制,类和分类同时调用一个方法会发生发生什么事情?

20.给一个首页添加一个头部如何实现?

21.组件之间如何解耦?

22.同步队列中block中执行异步操作,会发生什么事情?

23.runtime怎么理解的?

24.如果分类和原类拥有相同方法会发生什么事情:

如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类。因此在开发中尽量不要覆盖原有类;

25.动态库和静态库的区别:

总结

对于细碎知识点的学习,经过了不断的测试和理解,我们才会发现还有太多值得研究的地方。如果有不对的地方我会尽快更正。



 

 

 

 

 


 


 

 

 


 

 

转载于:https://www.cnblogs.com/coolcold/p/9799073.html


http://chatgpt.dhexx.cn/article/dMu3HqOM.shtml

相关文章

2019年iOS面试真题大全(3-5年)

如果你想去大公司,如果你是3年左右的iOS开发者,如果你对面试的未知没有十足的信心,如果你期望的薪资在15K,那么请认真刷完这300道面试题,都是真实公司经历的…答案会在近期更新!你要先自思考,看个人那些方面还不足! 1、自我介绍 2、如何实现一个倒计时功能&#xff0c;类似于蘑…

IOS开发系列之阿堂教程:构建开发IOS应用的虚拟机开发环境实践

说到IOS的开发,不能不说 到一个问题,如何配置和构建一个IOS的开发环境!我下面要说的主要是针对没有MAC Apple机的网友,如何安装和配置一个属于自己的IOS开发环境。如果已经有MAC 苹果机的网友,请忽略此文。因为有MAC 苹果机,就只需要安装XCODE的IDE开发工具就行了。 …

web安全渗透测试基础知识

渗透测试入门 渗透测试前置知识靶场环境搭建windows基础网络基础web应用/架构搭建/站库分离/路由访问web四大件-系统web四大件-中间件web四大件-数据库web四大件-源码路由访问 web架构/前后端分离/建站分配Web架构/OSS存储/CDN加速/反向代理APP架构反弹SHELL/文件下载抓包技术算…

《iOS移动开发从入门到精通》图书连载2:如何成为一名iOS开发者

iOS开发人员&#xff0c;和其它传统开发者相比有哪些不同之处&#xff1f;需要具备怎样的硬件和软件条件&#xff1f;今天我们就来说说这一部分的内容。 一.硬件上的需求 开发iOS应用&#xff0c;首先您需要使用Apple的电脑。尽管您可以使用黑苹果或者虚拟机&#xff0c;在PC上…

Jetson Nano目标检测手把手实战教程(pytorch训练、tensorrt推理,含完整代码和数据)

目录 一、概述 1.1 深度学习和边缘计算 1.2 Jetson Nano简介 二、深度学习环境安装 2.1 Pytorch框架 2.2 在Jetson Nano上安装Pytorch 三、算法原理 四、具体实现步骤 4.1 工程代码和环境准备 4.2 模型训练和推理 4.2.1数据集准备 4.2.2训练 4.2.3模型转换 4.2.4…

各种HOOK方式和检测对抗方法

一、什么是HOOK? hook翻译过来是拦截的意思, 我们很多时候也叫钩子,其实是很形象的. hook有什么作用呢? 1.当代码执行到某行时,获取寄存器值和内存里的值&#xff0c;进行调试分析&#xff0c;例如hook明文包. 2.当代码执行到某行时,插入想执行的代码.例如迅雷拦截发包函…

2019 - iOS最新最全面试题梳理(内含框架和算法题)

内存中的区域划分 栈区(stack):由系统自动分配和释放&#xff0c;存放局部变量的值&#xff0c;容量小速度快&#xff0c;有序 堆&#xff1a;一般由程序员分配和释放&#xff0c;如果不释放&#xff0c;则出现内存泄露。程序会回收您的内存&#xff0c;特点&#xff1a;容量大…

②(常识篇)、《史上最全iOS八股文面试题》2022年,金三银四我为你准备了,iOS《1000条》笔试题以及面试题(包含答案)。带面试你过关斩将,(赶紧过来背iOS八股文)

iOS面试题 一共分为笔试题和面试题两部分 笔试题 一共分为10个 总共613题 面试题 一共400题 笔试题 一个10个系列 分别为 ①(语法篇) 共147题 已更新 ②(常识篇) 共72题 已更新 ③(界面篇) 共83题 已更新 ④(iOS篇) 共52题 已更新 ⑤(操作篇) 共68题 已更新 ⑥(数据结构篇) 共2…

【功能测试】part1

目录 1、什么是软件测试 2、计算机基础知识 --硬件系统 --软件系统 1、系统软件&#xff1a;控制硬件&#xff08;不做测试&#xff09; 2、应用软件&#xff08;测试&#xff09; --B/S和C/S架构 B/S&#xff1a;Browser-Server C/S&#xff1a;Client-Server B/S软…

直播平台搭建,完整产业链和操作流程解析

直播平台的出现丰富并创新了国民的娱乐方式。因为直播是全平台开放&#xff0c;对主播的要求门槛并不是太高&#xff0c;所以几乎人人都可以参与并以自己独特的方式向观众分享娱乐。 完整的直播产业链包含5个模块&#xff1a; 内容提供方&#xff1a;用以生产内容和打造网红产…

直播平台php搭建框架,搭建自己的直播平台需要知道这些内容

原标题&#xff1a;搭建自己的直播平台需要知道这些内容 虽说当今的移动互联网风口在短视频&#xff0c;但直播平台依旧有着自己的“江湖地位”。近年来直播平台开发技术越来越完善&#xff0c;使得搭建直播平台的门槛大大降低&#xff0c;如果要搭建自己的直播平台需要知道哪些…

带货直播平台搭建有何不同之处

直播平台已经逐步在向商务方向发展,人们对直播的要求也变得越来越多样化,但是无论怎样发展,归根结底还是要靠着流量发展,对于带货直播搭建平台来说,更是如此,当代,直播平台的用户是混合的,那么带货直播平台搭建与其他方式相比有何不同之处呢?    1、带货直播平台搭…

带货直播平台搭建功能模块详细介绍

从近几年开始,直播的发展可谓是越来越快,直播已经贯穿到生活的方方面面,大街上,公园里,景点前,随处可见都是主播的身影,到如今,直播已经注入了许多新的元素,比如:带货直播。带货直播是一种新型的零售方式,它打破了传统零售的固有方式,让购物变得更加时尚,更加方便…

考验直播平台搭建水平的十个性能指标

在直播平台搭建中,开发人员和项目经理们在保证项目完成进度的同时,无时不刻的关注着程序的性能和可扩展性。本文罗列了优化直播平台搭建需要参考的十个性能指标。 用户日活粘性 用户需求调研,能够根据用户的需求,来规划直播平台搭建的功能、内容、页面等

webrtc 搭建直播平台

设计思路 需求&#xff1a; 一个直播页面&#xff0c;可以输入直播名。一个观看页面输入客户名个要看的直播名建立直播视频传输 思路&#xff1a; 直播页面输入直播名建立websocket连接&#xff0c;创建PeerConnection对象组存放连接本直播端的PeerConnection对象。观看页面…

一对一直播平台搭建,选择直播系统源码,这几点不容忽视

想要运营一个一对一直播平台&#xff0c;搭建网站是前提&#xff0c;而选择源码则是一切的基础&#xff0c;他关系到直播平台能否平稳运行。当然&#xff0c;源码的价格也都不便宜&#xff0c;便有很多想要自己开发平台的人&#xff0c;从各种渠道查找免费的直播源码使用&#…

直播网站云服务器搭建,什么是云服务器,直播平台搭建又该如何选择呢?

一个直播平台搭建的成功离不开云服务器&#xff0c;互联网云时代的到来&#xff0c;为平台搭建提供了便利&#xff0c;很多人都听说过但对云服务器不是很了解&#xff0c;那么现在跟大家介绍一下什么叫做云服务器&#xff0c;我们在直播平台搭建时该如何选择云服务器&#xff1…

Android如何来搭建直播平台

Android如何来搭建直播平台 目录 环境准备 ●Centos系统安装&#xff1a;请查看我的另一篇博客Java后端之路&#xff08;六&#xff09;安装Linux系统 ●git安装&#xff08;系统如果没有的话&#xff09;&#xff1a;www.cnblogs.com/imyalost/p/…&#xff0c;git配置完后记…

直播平台搭建的主要方式和开发细节

在线直播平台搭建的方式有很多&#xff0c;常见的方式主要有以下几种&#xff1a; 1. 招聘并组建研发团队&#xff0c;自主研发&#xff1a;自主研发需要硬件和维护成本&#xff0c;最主要的还是时间成本&#xff0c;一般需要至少半年的时间&#xff0c;有意向自主研发搭建直播…

一对一直播源码,一对一直播平台搭建,特色功能智能匹配

一对多直播平台上&#xff0c;互动随着播主的火热程度下降&#xff0c;而一对一直播开发特性&#xff0c;让其具备社交互动&#xff0c;更是主打的聊天&#xff0c;在社交价值上显然一对一直播开发更具有想象的空间。 从一对一直播源码效果看一对一直播是全方位实时同步&#…