个人去面试遇到的问题与记录

深拷贝和浅拷贝

https://www.jianshu.com/p/e6a7cdcc705d

OC和swift有什么区别

1.OC是动态语言,swift是静态语言
https://blog.csdn.net/it_201607/article/details/73187677

栈和堆友什么区别

1.对象放在堆中
2.常量保存在常量区
https://www.jianshu.com/p/746c747e7e00

进程和线程的区别?同步异步的区别?并行和并发的区别?

https://www.cnblogs.com/hs-funky/p/6512515.html

super,superClass,class的区别

class:获取当前方法调用者的类
superclass:获取当前方法调用者的父类

super:仅仅是一个编译指示器,就是给编译器看的,不是一个指针
本质:只要编译器看到super这个标志,就会让当前对象去调用父类方法,本质还是当前对象在调用

// self -> Person
// 打印结果:  Person NSObject Person NSObject
NSLog(@"%@ %@ %@ %@",[self class], [self superclass], [super class], [super superclass]);}

什么是MVC

MVC.png

  • Model和View永远不能相互通信,只能通过Controller传递。
  • Controller可以直接与Model对话,Model通过Notification和KVO机制与Controller间接通信。
  • Controller可以直接与View对话,通过outlet,直接操作View,outlet 直接对应到View中的控件,View通过action向Controller报告事件的发生。Controller是View的直接数据源。Controller是View的代理,以同步 View与Controller。

ios类别和扩展的作用是什么?它们有什么区别?

类别:

1.是对原有类的扩充
2.对原有类的分散
3.可以声明私有方法
4.不能添加实例变量
创建类别的三种方法:1.在其他类文件中可以声明。2.在本类中声明类别。3.可以单独创建类别文件。

区别:类别的小括号中必须有名字

扩展:

1.可以扩展私有的实例变量和方法
扩展的创建方式:1.直接在本类中创建。2.可以单独创建扩展文件。

继承:

继承(inherit),一个类(子类)继承于另一个类(父类),那么子类不仅拥有父类所有的属性和方法,而且可以创建属于自己的属性和方法。

retain, assign,copy的应用场景与区别

assign: 简单赋值,不更改索引计数(Reference Counting)。
使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)

copy: 建立一个索引计数为1的对象,然后释放旧对象
使用copy: 对NSString

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
使用retain: 对其他NSObject和其子类

@dynamic的作用

@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。
@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。

assign和weak修饰符的区别

assign与weak,它们都是弱引用声明类型,最大的区别在那呢?
如果用weak声明的变量在栈中就会自动清空,赋值为nil。
如果用assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指针错误!

block的作用,以及在ARC环境下的区别

首先就是Block是什么?用一句话来概括就是带有自动变量的匿名函数。
//(MRC)block在堆中时,不想对block进行retain操作,前面加__block
//(ARC)前面加__weak或__unsafe_unretained
//__weak和__unsafe_unretained的区别:__weak则在释放时会对对象赋值nil,后者不会

X的适配

34

Controller的生命周期

https://www.jianshu.com/p/d60b388b19f5
1.alloc       创建对象,分配空间。
2.init       初始化对象,初始化数据。
3.loadView   从nib载入视图,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4.viewDidLoad   载入完成,可以进行自定义数据以及动态的创建其他空间。
5.viewWillAppear  视图将出现在屏幕之前。
6.viewDidAppear  视图在屏幕上渲染完成。
7.viewWillDisappear  视图被移除之前。
8.viewDidDisappear   视图被移除之后。
9.dealloc        销毁视图。

Instruments工具

######CPU性能 — Time Profiler
######图形性能 — Core Animation
######内存性能 — Leaks

简述tcp与udp的功能是什么

TCP(传输控制协议):

1.提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用服务,是面向连接,端到端的传输。

2.面向连接:正式通信前必须要与对方建立连接。事先为所发送的数据开辟出连接好的通道,然后再进行数据发送,像打电话。

3.TCP支持的应用协议:Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传输协议)。TCP用于传输数据量大,可靠性要求高的应用。

TCP的三次握手:

TCP的三次握手.png

(1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

(2)第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

(3)第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

UDP(用户数据报协议,User Data Protocol):

1.面向非连接的(正式通信前不必与对方建立连接,不管对方状态就直接发送,像短信,QQ),不能提供可靠性、流控、差错恢复功能。UDP用于一次只传送少量数据,可靠性要求低、传输经济等应用。

2.UDP支持的应用协议:NFS(网络文件系统)、SNMP(简单网络管理系统)、DNS(主域名称系统)、TFTP(通用文件传输协议)等。

总结:

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

http和https的区别与联系

一、HTTP和HTTPS的基本概念

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

二、HTTP与HTTPS有什么区别?

HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

有多少种排序算法

iOS 开发中常用的排序(冒泡、选择、快速、插入、希尔、归并、基数)算法
排序算法.jpg

结构体和类有什么区别

1.只能在类里面写方法,不能在结构体里面写方法
2.类——对象,结构体——值
3.类——引用类型,位于栈上的指针(引用),位于堆上的实体对象
4.结构体——值类型,实例直接位于栈中
拷贝行为:
classname *a = b; a和b都是指针(指针存储在栈上),都指向同一个对象(对象存储在堆中),对象的值改变,a和b同时改变
structname a = b; 进行的是值拷贝(复制值后存储在栈上),如果改变b的值,a的值不会跟着改变

Swift怎么解析JSON

ObjectMapper
#谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?

蓝牙开发

< BabyBluetooth> 简单易用的蓝牙ble库,基于CoreBluetooth
下载地址:https://github.com/coolnameismy/BabyBluetooth

1 导入CoreBluetooth头文件,建立主设备管理类,设置主设备委托
2 扫描外设(discover),扫描外设的方法我们放在centralManager成功打开的委托中,因为只有设备成功打开,才能开始扫描,否则会报错。
3 连接外设(connect)
4扫描外设中的服务和特征(discover)
4.1获取外设的services
4.2获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值
5 把数据写到Characteristic中
6 订阅Characteristic的通知
7 断开连接(disconnect)

Block 为什么要用copy属性

Block一开始放在栈上的,而代码块内的数据会用到本地变量,只有Copy会才能放到堆上,而且本地变量要使用弱引用,retain不加1
默认情况下,block是存档在栈中,可能被随时回收,通过copy操作可以使其在堆中保留一份, 相当于一直强引用着, 因此如果block中用到self时, 需要将其弱化, 通过__weak或者__unsafe_unretained.
在 Objective-C 语言中,一共有 3 种类型的 block:
_NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。
_NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。
_NSConcreteMallocBlock 保存在堆中的 block,当引用计数为 0 时会被销毁。

KVO实现原理?

KVO基本原理:
1.KVO是基于runtime机制实现的。
2.当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制。
3.如果原类为Person,那么生成的派生类名为NSKVONotifying_Person。
4.每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法。
5.键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey:一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey:会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。
参考网站:
https://mp.weixin.qq.com/s/ttVZB_tEhF7SjUghCn7NfQ
https://www.jianshu.com/p/292f897719e9

项目中网络层如何做安全处理?

1、尽量使用https

https可以过滤掉大部分的安全问题。https在证书申请,服务器配置,性能优化,客户端配置上都需要投入精力,所以缺乏安全意识的开发人员容易跳过https,或者拖到以后遇到问题再优化。https除了性能优化麻烦一些以外其他都比想象中的简单,如果没精力优化性能,至少在注册登录模块需要启用https,这部分业务对性能要求比较低

2、不要传输明文密码

不知道现在还有多少app后台是明文存储密码的。无论客户端,server还是网络传输都要避免明文密码,要使用hash值。客户端不要做任何密码相关的存储,hash值也不行。存储token进行下一次的认证,而且token需要设置有效期,使用refreshtoken去申请新的token。

3、Post并不比Get安全

事实上,Post和Get一样不安全,都是明文。参数放在QueryString或者Body没任何安全上的差别。在Http的环境下,使用Post或者Get都需要做加密和签名处理。

4、不要使用301跳转

301跳转很容易被Http劫持攻击。移动端http使用301比桌面端更危险,用户看不到浏览器地址,无法察觉到被重定向到了其他地址。如果一定要使用,确保跳转发生在https的环境下,而且https做了证书绑定校验。

5、http请求都带上MAC

所有客户端发出的请求,无论是查询还是写操作,都带上MAC(Message Authentication
Code)。MAC不但能保证请求没有被篡改(Integrity),还能保证请求确实来自你的合法客户端(Signing)。当然前提是你客户端的key没有被泄漏,如何保证客户端key的安全是另一个话题。MAC值的计算可以简单的处理为hash(request
params+key)。带上MAC之后,服务器就可以过滤掉绝大部分的非法请求。MAC虽然带有签名的功能,和RSA证书的电子签名方式却不一样,原因是MAC签名和签名验证使用的是同一个key,而RSA是使用私钥签名,公钥验证,MAC的签名并不具备法律效应。

6、http请求使用临时密钥

高延迟的网络环境下,不经优化https的体验确实会明显不如http。在不具备https条件或对网络性能要求较高且缺乏https优化经验的场景下,http的流量也应该使用AES进行加密。AES的密钥可以由客户端来临时生成,不过这个临时的AES
key需要使用服务器的公钥进行加密,确保只有自己的服务器才能解开这个请求的信息,当然服务器的response也需要使用同样的AES
key进行加密。由于http的应用场景都是由客户端发起,服务器响应,所以这种由客户端单方生成密钥的方式可以一定程度上便捷的保证通信安全。
######7、AES使用CBC模式
不要使用ECB模式,记得设置初始化向量,每个block加密之前要和上个block的秘文进行运算。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值