最近整理了些许有用的知识点,边看,边怀疑,边验证,随后自己有了深刻的理解,还是很有意思的,这里只贴出相关一些东西。
1、copy修饰符修饰mutableArray之后,copy或者mutablecopy会产生什么。
答:
a、使用copy方法之后,新的对象是一个不可变的__NSSingleObjectArrayI(只有一个元素)类型,两个元素的时候会是一个不可变的__NSArrayI类型
b、使用mutableCopy方法之后,新的对象是一个可变的数组。
c、对于不可变的增删,会导致crash
2、内购
1、加载内购产品列表(最初配置)
2、发起充值请求
3、验证购买信息
4、验证成功之后向,上传订单信息到后端服务器,然后苹果事务队列删除订单信息
3、cocoaPod
简介:提供三方管理库工具,方便管理,无需做很多配置
1、 所有的依赖库都放在Pods下,主项目依赖Pods项目。
2、 .cocoaPods通过xcconfig的文件在编译的时设置所有的依赖和参数
3、 pod install 会把安装信息写在.lock文件中,只解决还没有在.lock文件中列出的依赖,会搜索安装指定版本;对于已列出的会下载指定版本,不检查是否有更新。
4、 pod update会检查安装podfile中列出的所有pod版本,比较慢
5、关于assign retain copy weak
assign:赋值特性setter方法将传入参数赋值给实例变量,可以用于非OC对象
retain:持有特性setter放发将传入参数先保留,再赋值,传入参数的会引用计数+1
copy:赋值特性setter将传入的对象复制一份
weak:对象销毁时,指针会被置nil,避免野指针
6:声明NSString NSArray NSDictionary为什么经常使用copy,不使用strong,使用copy就是持有一个不可变的副本,strong可能持有一个可变的对象,容易在外面被修改会影响该属性
7:copy修饰 NSMutableArray 添加修改删除的时候会crash
8:@protocol 和 category 中如何使用 @property
在protocol中使用property只会生成setter和getter方法声明,我们使用属性的目的,是希望遵守我协议的对象的实现该属性
category 使用 @property 也是只会生成setter和getter方法的声明,如果我们真的需要给category增加属性的实现,需要借助于运行时的两个函数
objc_setAssociatedObject
objc_getAssociatedObject
9: @synthesize和@dynamic分别有什么作用?
@property有两个对应的词,一个是@synthesize,一个是@dynamic。
如果@synthesize和@dynamic都没写,那么默认的就是@syntheszie var = _var;
@synthesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。
@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var =someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
10: 一个objc对象如何进行内存布局?(考虑有父类的情况)
1、所有父类的成员变量和自己的成员变量都会存放在该对象所对应的存储空间中.
2、每一个对象内部都一个isA指针,指向他的类对象,
3、类对象中存放着本对象的对象方法列表和成员变量的列表,属性列表,它内部也有一个isA指针指向元对象(meta class)。
4、对象内部存放的是类方法列表,类对象内部还有一个superclass的指针,指向他的父类对象根对象就是NSobject
11、runtime如何通过selector找到对应的IMP地址?(分别考虑类方法和实例方法)
每一个类对象中都一个方法列表,方法列表中记录着方法的名称,方法实现,以及参数类型,其实selector本质就是方法名称,通过这个方法名称就可以在方法列表中找到对应的方法实现.
类方法
类方法是属于类对象的
类方法只能通过类对象调用
类方法中的self是类对象
类方法可以调用其他的类方法
类方法中不能访问成员变量
类方法中不定直接调用对象方法
实例方法
实例方法是属于实例对象的
实例方法只能通过实例对象调用
实例方法中的self是实例对象
实例方法中可以访问成员变量
实例方法中直接调用实例方法
实例方法中也可以调用类方法(通过类名)
12、runloop和线程有什么关系?
1、每一个线程中都一个runloop,只有主线的的runloop默认是开启的,其他线程的runloop是默认没有开启的
2、可以通过CFRunLoopRun() 函数来开启一个事件循环
看SDWebImage源码的时候见到有这么用过.
3、model 主要是用来指定时间在运行循环中的优先级的
苹果公开提供的 Mode 有两个:
kCFRunLoopDefaultMode
kCFRunLoopCommonModes
4、如果我们把一个NSTimer对象以kCFRunLoopDefaultMode添加到主运行循环中的时候,当一直有用户事件处理的时候,NSTimer将不再被调度
5、如果我们把一个NSTimer对象以kCFRunLoopCommonModes添加到主运行循环中的时候,当一直有用户事件处理的时候,NSTimer还能正常的调度,互不影响.
13、runloop内部是如何实现的?
1、他是一个死循环
2、如果事件队列中存放在事件,那就取出事件,执行相关代码
3、如果没有事件,就挂起,等有事件了,立即唤醒事件循环,开始执行.
14、autoreleasepool
当一个runLoop结束的时候,才会执行一次autorelease
15、block什么时候循环引用
当一个对象强引用block,block中直接使用该对象,就会发生循环引用,用weak修饰
16、系统中的某些block api是否需要考虑循环引用的问题
一般不需考虑,官方文档没有告诉我们需要注意发生强用用
17、GCD的队列(dispatch_queue_t)分哪两种类型
串行队列和并行队列
18、如何用GCD同步若干个异步调用?(如根据若干个url异步加载多张图片,然后在都下载完成后合成一张整图)
group notify
19、dispatch_barrier_async的作用是什么?
栅栏函数,在barrier块完成之前,不会执行barrier块之后提交的任何块。
20、sync同步执行死锁
比如:
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@”1”);
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@”2”);
});
NSLog(@”3”);
}
同步执行的时候阻塞主线程,等代码块执行完毕;执行block里面的代码块,当把block块里面代码放在主线程执行,这个时候主线程卡住了,无法完成,造成死锁。
21、IBOutlet连出来的视图属性为什么可以被设置成weak?
因为视图已经对它有一个强引用了
22、IB中User Defined Runtime Attributes如何使用?
User Defined Runtime Attributes 是一个不被看重但功能非常强大的的特性,它能够通过KVC的方式配置一些你在interface builder 中不能配置的属性。当你希望在IB中作尽可能多得事情,这个特性能够帮助你编写更加轻量级的viewcontroller
23、类别的作用?继承和类别在实现中有何区别?用哪个好? 类别和类扩展的区别(怎么向类中添加属性).
1、category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
2、继承可以增加,修改或者删除方法,并且可以增加属性。类别好,不影响类与原有类的关系.category和extensions的不同在于后者可以添加属性。
24、设计模式
MVC设计模式考虑三种对象:
1、模型对象:模型对象代表 特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。
2、视图对象:视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。
3、和控制器对象:控制器对象是应用程序的视图对象和模型对象之间的协调者。
1、设计模式:并不是一种新技术,而是一种编码经验,使用比如java中的接口,iphone中的协议,继承关系等基本手段,用比较成熟的逻辑去处理某一种类型的事情,总结为所谓设计模式。
2、面向对象编程中,java已经归纳了23种设计模式。
3、mvc设计模式 :模型,视图,控制器,可以将整个应用程序在思想上分成三大块,对应是的数据的存储或处理,前台的显示,业务逻辑的控制。 iPhone本身的设计思想就是遵循mvc设计模式。其不属于23种设计模式范畴。
4、代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用.比如一个工厂生产了产品,并不想直接卖给用户,而是搞了很多代理商,用户可以直接找代理商买东西,代理商从工厂进货.常见的如QQ的自动回复就属于代理拦截,代理模式在iphone中得到广泛应用.
5、单例模式:说白了就是一个类不通过alloc方式创建对象,而是用一个静态方法返回这个类的对象。系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为,比如想获得[UIApplication sharedApplication];任何地方调用都可以得到 UIApplication的对象,这个对象是全局唯一的。
6、观察者模式: 当一个物体发生变化时,会通知所有观察这个物体的观察者让其做出反应。实现起来无非就是把所有观察者的对象给这个物体,当这个物体的发生改变,就会调用遍历所有观察者的对象调用观察者的方法从而达到通知观察者的目的。
25、keyPath KVC KVO
keyPath
用于指定一个连接在一起的对象性质序列,键路径使您可以以独立于模型实现的方式指定相关对象的性质。
NSString *nameStr2 = [self valueForKeyPath:@"dog.name"];
KVC:间接访问对象的属性使用字符串来标识属性,效率低,无法在编译阶段识别错误
KVO:键值观察,用于监听,可以用RAC实现
26、响应链和事件传递
1、当iOS程序中发生触摸事件后,系统会将事件加入到UIApplication管理的一个任务队列中
2、UIApplication将处于任务队列最前端的事件向下分发。即UIWindow。
3、UIWindow将事件向下分发,即UIView。
4、UIView首先看自己是否能处理事件,触摸点是否在自己身上。如果能,那么继续寻找子视图。
5、遍历子控件,重复以上两步。
6、如果没有找到,那么自己就是事件处理者。
7、如果自己不能处理,那么不做任何处理。
其中 UIView不接受事件处理的情况主要有以下三种
1)alpha <0.01
2)userInteractionEnabled = NO
3)hidden = YES
27、TCP和UDP的区别与联系
1、TCP为传输控制层协议,为面向连接、可靠的、点到点的通信;
2、UDP为用户数据报协议,非连接的不可靠的点到多点的通信;
3、TCP侧重可靠传输,UDP侧重快速传输。
28、TCP三次握手
1、第一次握手,客户端发送syn包(syn=j)到服务器,进入SYN_SEND状态
2、第二次握手,服务器接收到syn包,确认客户的SYN(ackj+1),同时自己发送一个syn包,即SYN+ACK,此时服务器进入SYN_RECV状态
3、客户端接收到服务器的SYN+ACK包,向服务器发送确认ACK包(ack=k+1),此时发送完毕,客户端和服务器进入ESTABLESHED状态,三次握手完毕
29、Scoket连接和HTTP连接
1、HTTP协议是基于TCP连接的,是应用层协议,主要解决如何包装数据。
2、Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
3、HTTP连接:短连接,客户端向服务器发送一次请求,服务器响应后连接断开,节省资源。服务器不能主动给客户端响应(除非采用HTTP长连接技术),iPhone主要使用类NSURLConnection。
4、Socket连接:长连接,客户端跟服务器端直接使用Socket进行连接,没有规定连接后断开,因此客户端和服务器段保持连接通道,双方可以主动发送数据,一般多用于游戏.Socket默认连接超时时间是30秒,默认大小是8K(理解为一个数据包大小)。
30、HTTP协议的特点,GET和POST的区别
GET和POST的区别:
1、HTTP超文本传输协议,是短连接,是客户端主动发送请求,服务器做出响应,服务器响应之后,链接断开。HTTP是一个属于应用层面向对象的协议,HTTP有两类报文:请求报文和响应报文。
2、HTTP请求报文:一个HTTP请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、HTTP响应报文:由三部分组成:状态行、消息报头、响应正文。
4、GET请求:参数在地址后拼接,没有请求数据,不安全(因为所有参数都拼接在地址后面),不适合传输大量数据(url长度有限制)。
5、GET提交、请求的数据会附在URL之后,即把数据放置在HTTP协议头中。以?分割URL和传输数据,多个参数用&连接。如果数据是英文字母或数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。
6、POST请求:参数在请求数据区放着,相对GET请求更安全,并且数据大小没有限制。把提交的数据放置在HTTP包的包体中.
7、GET提交的数据会在地址栏显示出来,而POST提交,地址栏不会改变。
传输数据的大小:
1、GET提交时,传输数据就会受到URL长度限制,POST由于不是通过URL传值,理论上限不受限。
安全性:
2、POST的安全性要比GET的安全性高;
通过GET提交数据,用户名和密码将明文出现在URL上,比如登陆界面有可能被浏览器缓存。
3、HTTPS:安全超文本传输协议(Secure Hypertext Transfer Protocol),它是一个安全通信通道,基于HTTP开发,用于客户计算机和服务器之间交换信息,使用安全套结字层(SSI)进行信息交换,即HTTP的安全版。
31、XML数据解析方式各有什么不同
XML数据解析的两种解析方式:DOM解析和SAX解析;
DOM:DOM解析必须完成DOM树的构造,在处理规模较大的XML文档时就很耗内存,占用资源较多,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值,通常情况下,可以借助XPath查询XML节点;
SAX:SAX与DOM不同,它是事件驱动模型,解析XML文档时每遇到一个开始或者结束标签、属性或者一条指令时,程序就产生一个事件进行相应的处理,一边读取XML文档一边处理,不必等整个文档加载完才采取措施,当在读取解析过程中遇到需要处理的对象,会发出通知进行处理。因此,SAX相对于DOM来说更适合操作大的XML文档。
JSON解析:性能比较好的主要是第三方的JSONKIT和iOS自带的JSON解析类,其中自带的JSON解析性能最高。
32、对沙盒的理解
每个iOS应用都被限制在“沙盒”中,沙盒相当于一个加了仅主人可见权限的文件夹,及时在应用程序安装过程中,系统为每个单独的应用程序生成它的主目录和一些关键的子目录。苹果对沙盒有几条限制:
1.应用程序在自己的沙盒中运作,但是不能访问任何其他应用程序的沙盒;
2.应用之间不能共享数据,沙盒里的文件不能被复制到其他应用程序的文件夹中,也不能把其他应用文件夹复制到沙盒中;
3.苹果禁止任何读写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中;
4.沙盒目录里有三个文件夹:
Documents存储应用程序的数据文件,存储用户数据或其他定期备份的信息;
Library下有两个文件夹,Caches存储应用程序再次启动所需的信息,
Preferences包含应用程序的偏好设置文件,不可在这更改偏好设置;
temp存放临时文件即应用程序再次启动不需要的文件。
获取沙盒根目录的方法,有几种方法:用NSHomeDirectory获取。获取Document路径:
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).
33、iOS核心框架
CoreAnimation
CoreGraphics
CoreLocation
AVFoundation
Foundation
34、viewController各个方法的调用时期
当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、alloc :创建对象,分配空间
2、init (initWithNibName) :初始化对象,初始化数据
3、loadView : 从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad :载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear : 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear : 视图已在屏幕上渲染完成
当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear : 视图将被从屏幕上移除之前执行
2、viewDidDisappear : 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc :视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
35、iOS核心机制
UITableView 重用
ObjC内存管理;自动释放池,ARC如何实现
runloop
runtime
Block的定义、特性、内存区域、如何实现
Responder Chain
NSOperation
GCD
36、iOS新特性、新技术
iOS7 UIDynamic、SpritKit、新布局、扁平化
iOS8 应用程序扩展、HealthKit、SceneKit、CoreLocation、TouchID、PhotoKit
iOS9 Apple Watch
第三方库:SDWebImage、AFNetwork、JSONKit、wax
swift