* 注:以下内容有网上搜索摘取,仅供大家参考学习,如有问题欢迎指正。
1.weak 关键字
weak 表示对对象的弱引用。weak此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值(此特质同assign类似),当它们指向的对象释放以后,weak会被自动设置为nil。
常用在delegate等属性的设置(防止循环引用),自定义IBOutlet控件中一般也使用(属性自身已经对它进行一次强引用,没有必要再强引用一次)
runtime 如何实现 weak 变量的自动置nil?
runtime 对注册的类会进行布局,对于weak 对象会放入一个 hash表中。 用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候就会 dealloc。假如 weak 指向的对象内存地址是a,那么就会以a为键,在这个weak 表中搜索,找到所有以a为键的weak对象,从而设置为 nil。
2.copy 关键字
copy 此特质所表达的所属关系与 strong 类似,然而设置方法并不保留新值,而是将其“拷贝” (copy)。当属性类型为 NSString 时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向一个 NSMutableString 类的实例。(用 @property 声明 NSString等经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。)
3.深拷贝和浅拷贝
- 浅拷贝(copy):只复制指向对象的指针。
- 深拷贝(mutableCopy):复制引用对象本身,开辟一个内存地址。(当修改A时,A_copy不变)
4.Runtime消息机制 前面文章有写过
Objective-C在运行时会转化为C代码执行,即运行时会被动态转为消息发送(objc_msgSend(receiver, selector)
)。可以通过Runtime的一系列方法获取类的一些信息(包括属性列表,方法列表,成员变量列表,和遵循的协议列表)。
(objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表以及其父类方法列表中寻找方法运行,然后在发送消息的时候,objc_msgSend方法不会返回值,所谓的返回内容都是具体调用时执行的。)
5.RunLoop(简单描述,后面有时间再详写)
一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,这种模型通常被称作 Event Loop。
Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如 Windows 程序的消息循环,再比如 OSX/iOS 里的 RunLoop。实现这种模型的关键点在于:如何管理事件/消息,如何让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。
RunLoop 实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行上面 Event Loop 的逻辑。线程执行了这个函数后,就会一直处于这个函数内部 “接受消息->等待->处理” 的循环中,直到这个循环结束(比如传入 quit 的消息),函数返回。
OSX/iOS 系统中,提供了两个这样的对象:NSRunLoop 和 CFRunLoopRef。
CFRunLoopRef 是在 CoreFoundation 框架内的,它提供了纯 C 函数的 API,所有这些 API 都是线程安全的。
NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。
6.MVC模式
MVC、MVVM是一种架构模式,M表示数据模型Model、V表示View视图、C表示控制器Controller。
1、Model负责存储、定义、操作数据。2.View用来展示数据给用户,和用户进行操作交互。3.Controller是Model与View的协调者,
7.数据持久化(数据存储)
- 1.属性列表存储。只有NSString、NSArray、NSDictionary、NSData、BOOL、NSDate、NSNumber可以写入plist文件(writeToFile)。
- 2.对象序列化存储。对象序列化是通过键值关系存储到本地,转化成二进制流,通过对象反序列化取出,把二进制数据转换为本来类型。
以上两种适合小数据量存储和查询操作。 - 3.SQLite数据库、适合大量的有规律的数据存储和查询操作。
- 4.CoreData。管理对象进行增、删、改、查操作,是苹果官方提供的一套框架,可以将Objective-C对象转换成数据保存到SQL中,也可以将保存后的数据还原成OC对象。
8.多线程
当需要进行一些耗时间的操作时,会把耗时间的操作放到分线程中。多线程编程是防止主线程阻塞,增加运行效率的最佳方法。iOS下的主线程堆栈大小是1M,第二个线程就是512KB。
- NSThread:开辟一个分线程
- NSOperationQueue:线程操作队列。创建一个操作,绑定相应的方法,当把操作添加到操作队列中时,操作绑定的方法就会自动执行,默认会掉用main方法。
- GCD:宏大的中央调度。1.串行队列。2.并发队列。3.主线程队列。
- 同步和异步:同步和异步是相对另外一个任务而言的,同步指的是第一个任务不执行完,不会开始第二个。异步是不管第一个有没有执行完,都会开始第二个。
- 串行和并发 :串行和并发是相对于多个任务而言的,串行指的是多个任务按照一定的顺序执行,并发指的是多个任务同时进行。
9.HTTP链接和socket链接前面文章有写过
-
HTTP超文本传输协议,是短链接。是客户端主动发送请求,服务端作出响应,服务器响应之后链接断开。
-
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。
-
socket就是所谓的长链接,是客户端和服务器端直接使用socket“套接字”进行链接,并没有链接后断开,所以客户端可以和服务器端保持链接通道,双方都可以主动发送数据。一般用于即时性很强并且保持发送数据量比较大的场合使用。(主要用的类CFSocketRef)
- Socket通信是通过TCP/IP协议,实现客户端和服务器端之间的通信。客户端通过三次握手和服务器建立可靠的链接,然后进行数据传输。
-
TCP为传输控制层协议。这种协议可以提供面向连接的、可靠的、点到点的通信。
-
UDP为用户数据报协议。它可以提供非连接的不可靠的点到多点的通信。
-
通讯:就是客户端跟服务器之间的数据传递,客户端向服务器发送请求,服务器给客户端作出响应。
10.类别的作用
类别就是给系统原有的类添加方法,不能扩展属性。如果类别方法名和系统方法名一样,类别中的方法优先级更高
11.SDWebImage原理
1.首先从内存中查找图片(当图片在之前使用中被加载过),找到直接使用。
2.从沙盒中查找图片(当图片在之前使用中被加载过),找到直接使用,缓存到内存中。
3.从网络上获取图片。然后缓存到内存和沙盒。
12.UITableView单元格重用理解
UITableView通过重用单元格来达到节省内存的目的,通过对每个单元格指定一个重用标识符来指定单元格的种类。
当屏幕上的cell滑出屏幕时,系统会把这个单元格添加到重用队列中,等待被重用,当有新的单元格从屏幕外面滑入屏幕内时,系统会从重用列表查看有没有可以重用的单元格,如果有就拿过来用,如果没有就创建一个来使用。
13.KVC和KVO的理解
- Key Value Coding是cocoa的一个标准组成部分。KVC(键-值编码)是一个用于间接访问对象属性的机制,使用该机制不需要调用set或get方法来访问成员变量,它是通过
setValue:forKey:
和valueForKey:
方法来访问(用法类似字典)。 - KVO:是一个对象能够观察另外一个对象的属性的值,并且能够发现值的变化。当被观察的对象属性发生变化时,观察对象马上作出反应。它只能用来对属性作出反应,不会用来对方法或者动作作出反应。
14.delegate和NSNotification
- 代理是一种回调机制,代理是对象与对象之间的通信交互,解除了对象之间的耦合性,一般是一对一的通信。
- NSNotification通知是一对多的关系,一个对象向所有的观察者提供变更通知。(区别--KVO是被观察者向观察者直接发送通知)
15.网络推送
- 首先应用程序发送通知,向苹果服务器(APNS)请求device Token,应用程序接收到device Token并发送给自己的服务器端,服务器端将想要推送的消息和device Token发送给苹果服务器,苹果服务器APNS将推送消息发送给应用程序。
16.NS/CF/CG/CA/UI前缀含义
- NS 的函数归属于cocoa Fundation框架。
- CF 的函数归属于core Fundation框架。
- CG 的函数归属于CoreGraphics.framework框架。
- CA 的函数归属于CoreAnimation.framework框架。
- UI 的函数归属于UIKit框架。
17.生命周期
18.知识面了解
- Objective-C和C++都是C的面向对象的超集。
- 谓词就是通过NSPredicate给定的逻辑条件作为约束条件,完成对数据的筛选。
- atomic和nonatomic区别用来决定编译器生成的getter和setter是否为原子操作
- atomic提供了多线程安全,保证程序在多线程情况下,编译器会自动生成一些互斥加锁代码,防止读写未完成的时候被另一个线程读写,造成数据错误。就是防止在写入未完成的时候被另外一个线程读取,造成数据错误。但是会耗费资源,效率低下。
- nonatomic如果该对象不需考虑多线程的情况。不涉及到线程锁的频繁操作。效率和性能相对提高。
附:相关面试学习资料
网友评论