1. 请解释下method swizzling,并说出你一般什么时候会用到它?
Method Swizzling是一种在运行时修改方法名与方法实现映射关系的技术,常用于在系统内部方法的基础上增加新的处理流程。
2. 假设有三个对象,一个父类的父类,一个父类和一个子类。父类的父类持有父类的引用(retain),父类持有子类的引用(retain),子类持有父类的引用(retain)。父类的父类释放(release)父类,解释下会发生什么。
父类被父类的父类释放掉以后,父类的引用计数-1,而因为子类拥有父类的计数,父类并未销毁。
3. 当一个空指针(nil pointer)调用了一个方法会发生什么?
安然无恙 —— 这是oc自带的消息机制,nil也能发送消息,而不会报错.
4. 为什么retainCount绝对不能用在发布的代码中?
a,因为retainCount不靠谱,不能真实的反映一个对象的引用计数
b,使用 alloc release等东西,一一对应,不需要retainCount
c,app已然推荐ARC,连release都不用了,更何况retainCount
d,-retainCount受到时间和framework的影响太大,不能准确反映内存的引用计数
e,-retainCount很容易迷惑人,采取规范的内存管理才是王道
5.简述OC中内存管理机制
OC的内存管理机制是自动引用计数,内存管理的原则是谁开辟谁释放,分为ARC和MRC,MRC的话就是需要我们程序员手动管理内存,ARC不需要我们手动管理内存,系统会自行管理。MRC下new alloc copy retain创建的对象我们当我们不用的时候都要主动的release或者autorelease,如果是类方法创建的对象,那么系统自动释放池自动在适当的 时候会帮我们release,而在ARC下 xcode自动会帮我们人工智能的添加release autorelease操作.
6.readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?
readwrite可读可写,既生成setter方法,又生成getter方法.
readonly只读, 只生成getter方法, 不生成setter方法.
assign一般用于修饰基本数据类型和id类型或者代理协议.
copy拷贝, 一般用于 NSString. 分为深拷贝和浅拷贝, 深拷贝拷贝的是对象, 浅拷贝拷贝的是指针.
nonatomic非原子性,不为setter方法加锁,不考虑线程安全, 优点是效率高.
atomic原子性, 为setter方法加锁,优点是线程安全, 缺点是效率低,需要消耗大量的资源,默认是atomic.{使用建议:1)所有属性都声明为nonatomic,2)尽量避免多线程抢夺同一资源,3)尽量将加锁,资源抢夺的逻辑交给服务器去处理,减小移动客户端的压力。}
strong强引用, 和MRC下的retain一样.
weak弱引用, 类似MRC下的assign. 但是要注意的是strong和weak都是修饰对象类型的属性的, 不能修饰基本数据类型. ARC下仍然使用assign修饰基本数据类型.
7. 线程同步和异步的区别?
同步:一个线程要等待上一个线程执行完之后才能执行。异步:同时去做两个或者多个线程。
8.GET和POST的区别
get和post是http与服务器进行交互的常见方法。get,一般用于查询或者获取资源信息,而post一般是用于更新资源信息。
两者的区别是:
1) 用get提交的数据,会放在url后边,并且以问号分割url和传输的数据,参数之间以符号&相连,比如EditPosts.aspx?name=test1&id=123456;而对于post,它是把提交的数据放到http包的body体中。
2)get提交数据有大小限制,post没有
3)get是通过地址栏传值,post通过提交表单传值
4)post的安全性高一点。比如通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
9.进程和线程的区别和联系
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
10.谈谈instancetype和id的异同
相同点:都可以作为方法的返回类型;不同点:①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;②instancetype只能作为返回值,不能像id那样作为参数.
11.isKindOfClass和isMemberOfClass的区别
isKindOfClass来确定一个对象是否是一个类的成员,或者是派生自该类的成员isMemberOfClass只能确定一个对象是否是当前类的成员
12.block里面的如何防止retain cycle
使用弱引用打断block里面的retain cycle.MRC中_block是不会引起retain;但在ARC中_block则会引起retain。ARC中应该使用_weak或__unsafe_unretained弱引用
13.iOS多线程有哪几种实现方法?GCD中有哪些队列?分别是并行还是串行?
iOS中多线程编程工具主要3有:
1.NSThread
2.NSOperation
3.GCD
dispatch queue分为下面3种:而系统默认就有一串行队列main_queue和并行队列global_queue:
GCD中有三种队列类型:
The main queue:与主线程功能相同。实际上,提交至main queue的任务会在主线程中执行。main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是一个串行队列。
Global queues:全局队列是并发队列,并由整个进程共享。进程中存在三个全局队列:高、中(默认)、低三个优先级队列。可以调用dispatch_get_global_queue函数传入优先级来访问队列。
用户队列:用户队列 (GCD并不这样称呼这种队列, 但是没有一个特定的名字来形容这种队列,所以我们称其为用户队列) 是用函数 dispatch_queue_create
创建的队列. 这些队列是串行的。正因为如此,它们可以用来完成同步机制, 有点像传统线程中的mutex。
14.谈谈load和initialize的区别
15.Core Data是数据库么?有哪些重要的类?
Core Data确实不是一个数据库,只是把表和OC对象进行的映射,当时并不是进进映射那么简单,底层还是用的Sqlite3进行存储的,所以Core Data不是数据库。
有以下6个重要的类:
(1)NSManagedObjectContext(被管理的数据上下文)
操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
(2)NSManagedObjectModel(被管理的数据模型)
数据库所有表格或数据结构,包含各实体的定义信息
作用:添加实体的属性,建立属性之间的关系
操作方法:视图编辑器,或代码
(3)NSPersistentStoreCoordinator(持久化存储助理)
相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时机
(4)NSManagedObject(被管理的数据记录)
相当于数据库中的表格记录
(5)NSFetchRequest(获取数据的请求)
相当于查询语句
(6)NSEntityDescription(实体结构)
相当于表格结构
16.CocoaPods的原理
它其实是将所有的依赖库都放到另一个名为Pods项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。
17.最常用的版本控制工具是什么,能大概讲讲原理么?
SVN和GIT
18.你一般是怎么用 Instruments 的
Instruments 确实是一个很强大的工具,用它来收集关于一个或多个系统进程的性能和行为的数据极为方便,并能及时跟踪随着时间产生的数据.还可以广泛收集不同类型的数据.
19.单例会有什么弊端
1.由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
2.单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。
3.现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致共享的单例对象状态的丢失。
20.如何访问并修改一个类的私有属性?
有两种方法可以访问私有属性,一种是通过KVC获取,一种是通过runtime访问并修改私有属性
21.说说oc语言和别的语言的区别。
oc语言相当于c语言,它是面向对象的,所以自然具有面向对象的语言特性,如封装、继承、多态。
封装:隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别。
继承:继承就是子类可以使用从父类继承的属性和方法。
多态:接口的多种不同的实现方式即为多态。(如果一个语言只支持类而不支持多态,只能说明它基于对象的,而不是面向对象的。)
再说说为什么说oc是动态的语言。
runtime是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。
之所以说它是动态的,是因为它会将一些工作放在代码运行时才处理而并非编译时。也就是说,有很多类和成员变量在我们编译的时候是不知道的,而在运行时,我们所编写的代码会转换成完整的确定的代码运行。
22.HTTPS和HTTP的区别
HTTP 协议中的内容都是明文传输,HTTPS 的目的是将这些内容加密,确保信息传输安全。最后一个字母 S 指的是 SSL/TLS 协议,它位于 HTTP 协议与 TCP/IP 协议中间。其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的安全;而对于接收端,在SSL/TSL将接收的数据包解密之后,将数据传给HTTP协议层,就是普通的HTTP数据。HTTP和SSL/TSL都处于OSI模型的应用层。