面试题大杂烩

面试题大杂烩

1.iOS开发之事件响应链:

Appdelgate —-> UIApplication —-> UIWindow —-> UIViewController —-> UIView —-> UIButton

2.UITableView 的两种样式Plain和Group的区别:

Plain:tableview加载出来没有中间间距和头部间距

Group:tableview加载出来有中间间距和头部间距

一般默认并且常用:Plain

3.KVC中ValueForKey与ValueForKeyPath的区别:

在一般修改一个对象的属性时,ValueForKey与ValueForKeyPath没有什么区别,都可以改变属性值

强大之处:假如Person这个类中有dog有bone

ValueForKeyPath可以利用点语法,深层次的去寻找我们所需的属性

例如1:

1
2
3
4
5
6
7
8
NSDictionary *dic1 = @{@"city":@"北京",@"count":@"22"};
NSDictionary *dic2 = @{@"city":@"上海",@"count":@"18"};
NSDictionary *dic3 = @{@"city":@"深圳",@"count":@"17"};

NSArray *arr = @[dic1,dic2,dic3];

NSLog(@"city:%@",[arr valueForKeyPath:@"city"]);
NSLog(@"count:%@",[arr valueForKeyPath:@"count"]);

输出结果:

1
2
3
4
5
6
7
8
9
10
11
2016-08-03 15:07:05.276 ValueForKeyPath使用[5181:192059] city:(
"北京",
"上海",
"深圳"
)
2016-08-03 15:07:05.276 ValueForKeyPath使用[5181:192059] count:(
22,
22,
18,
17
)

例如2:

1
2
3
4
5
6
7
8
9
Student *student1 = [[Student alloc] init];
student1.name = @"小红";
student1.info = @{@"phone":@"13102212345",@"mail":@"xiaohong@qq.com"};

School *school = [[School alloc] init];
school.student = student1;

NSLog(@"%@",[school valueForKeyPath:@"student.name"]);
NSLog(@"%@",[school valueForKeyPath:@"student.info.phone"]);

输出结果:

1
2
3
2016-08-03 15:21:38.258 ValueForKeyPath使用[5261:202278] 小红
2016-08-03 15:21:38.258 ValueForKeyPath使用[5261:202278] 13102212345
2016-08-03 15:21:38.259 ValueForKeyPath使用[5261:202278] xiaohong@qq.com

4.iOS10+与iOS10之前,远程推送有何区别?

1.title,subtitle,body可用新版Server SDK发送,客户端不用修改;2.添加图片;3.利用Server SDK设置mutable-content字段,并在extra中增加字段imageUrl。

5.Block为什么加__block就可以改变变量?

Block不允许修改外部变量的值,外部变量指的是栈中指针的内存地址。__block所起到的作用就是只要观察到变量被block所持有,就可以将“外部变量”在栈中的内存地址改到堆中。进而在block内部也可以修改外部变量。

6.GCD多线程:主队列(main)和全区队列(global)

主队列:每个应用程序对应唯一一个主队列,直接get即可,使用主队列更新UI
PS:主队列同步,会锁死
全局队列:是系统的,直接GET使用,与并行队列类似,无法确认操作所在队列(调试时)

7.UITableView优化:

1、正确使用UITableView的重用机制
2、提前计算好cell的高度与布局
3、避免阻塞主线程
4、按需加载
5、尽可能重用开销较大的对象
6、尽可能减少计算复杂度
7、不要动态增加或者移除子控件
学会使用调试工具
异步绘制

8.使用KVO的注意事项:

1、addObserver在不需要监听的时候,及时remover,否则被监听对象释放后,再出发监听器就会崩溃
2、addObserver和removeObserver方法要一一对应。不要重复添加,也不要视图删除没添加的监听;重复监听:在被监听对象属性改变时,会多次调用监听方法,视图删除没有添加过的监听器会引起崩溃。

9.KVO实现原理:

1、KVO是基于runtime机制实现的
2、当某个类的属性对象第一次被观察时,系统就会在运行期动态得创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。派生类在被重写的setter方法内实现真正的通知机制
3、如果原类为person,那么生成的派生类名为:NSKVONotification_Person
4、每个类对象中都有一个isa指针指向当前类,当一个对象的第一次被观察,那么系统偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法
5、键值观察通知依赖于NSObject的两个方法:willChangeValueForKey和didChangeValueForKey,在一个被观察属性发生改变之前,willChangeValueForKey一定被调用,这就会记录旧的值。而当改变发生后,didChangeValueForKey会被调用,继而observerForKey:ofObject:change:context也会被调用

10.UIViewController与UIView生命周期

UIViewController:viewDidload –> viewWillAppear –> viewDidLayoutSubviews – > ViewWillDisappear –> viewDidDisappear –> dealloc

UIView: init –> layoutSubviews –> dealloc

11.重现GCD死锁:(主线程在同步队列中)

1
2
3
dispatch_sync(dispatch_get_main queue ^(){
//code
});

12.如何理解MVC设计模式和MVVM设计模式

MVC:一种架构模式,M:Model V:View C:Controller
Model负责存储,定义操作数据
View:用来展示给用户,和用户交互
Controller:是model和view协调者,C将M中的数据取过来给V用。C可以直接与V、M通信,而V不能与C直接通信。V与C通信需要用代理协议方式,当有数据更新,M要与C进行通信这是需要Notification和KVO。M、V无法通信。

MVVM:Model–View–ViewModel
ViewModel层,是View与Model的粘合剂,放置用户验证逻辑,视图显示逻辑,发起网络请求与其他各种代码最佳位置,将ViewCOntroller层的业务逻辑与页面逻辑剥离放入ViewModel层

13.为什么说Object-C是一门动态语言

Object-C类的类型和数据变量的类型都是在运行时确定,而不是在编译时确定。运行时(runtime)特性:可动态添加方法或替换方法

14.MVC、MVVM、MVP讲一下?

MVC:简单来说,逻辑、视图、数据进行分层,实现解耦

MVVM:Model-View-ViewModel模式简称。由于视图、视图模型、模型三大部分组成,比MVC更能让控制器释放臃肿,将一部分逻辑和数据的处理等操作从控制器中搬运到ViewModel
MVVM特点:1、低耦合。View可以独立于Model的变化和修改一个ViewModel可绑定多个不同View。View变化时Model可以不变,Model变化时View可以不变。2、可重用性。可将视图逻辑放入ViewModel,让很多View重写这段试图逻辑。3、独立开发。开发可专注业务逻辑和数据开发,设计可以专注界面设计。4、可测试性。可以针对ViewModel对界面进行测试。

MVP:Model–View–Present。模型、视图、Present。
Present作为View和Model的中间人,从Model层获取数据传给View,使View和Model没有耦合。优势:使Model和View没有耦合,使Model更具有复用性。

15.为什么代理要用weak修饰?代理的delegate与dataSource什么区别?block和代理区别?

代理用weak修饰。1、使用weak修饰防止循环使用。2、当使用weak修饰的属性,当对象释放时,系统对属性赋值为nil,OC对nil对象发送消息也就是调用方法,不会carsh。

delegate:传递事件,代理可以让A通知B,A变化时,前提B遵循A的代理,并实现A的代理方法。

dataSource:传递数据,对象A声明它所需数据,当我们创建A对象时,我们实现数据源,告诉A它所需的数据。例如:TableView的数据源方法告诉它需要几组Cell,每组几行,每个Cell实现什么

代理与Block区别:相同点:代理与Block大多是我们可以用来做倒叙传值。但得注意避免循环引用;不同点:代理使用weak修饰,代理必须声明方法。调用代理时判断是否实现;Block使用copy修饰,Block保存一段代码,(一个函数)并且可以自动捕捉自动变量,若想改变,必须使用__block修饰

16.属性的实质是什么?包括哪几个部分?属性默认关键字有哪些?@dynamic和@synthesize用来做什么?

属性是描述类的特征。也就是具备什么特性。三个部分,带下划线的成员变量,getter和setter方法。
默认关键词:readwriter、assgin、atomic,是针对基本类型(NSInteger、Bool、NSUInteger、int等)
针对引用类型,默认:strong、readwriter、atomic,例如:NSString、NSArray、NSDictionary等
@dynamic:修饰属性,其getter和setter方法编译器不会自动帮你去生成,必须自己实现。
@synthesize:修饰属性,其getter和setter方法编译器自动帮你去生成,且指定属性相对应的成员变量

17.属性的默认关键字是什么?

默认关键字,基本数据:atomic、readwrite、assgin
普通OC对象:atomic、readwrite、strong
readwrite:可读可写,需生成getter和setter方法
readOnly:只读,只生成getter,不希望属性在类外改变
assgin:赋值特性。setter方法传入参数赋值给实例变量,仅设置变量时,assgin用于基本数据类型
retain(MRC)/strong(ARC):表示持有特性,setter方法将传入的参数保留,再赋值,传入参数的retaincount加1
copy:拷贝特性,setter方法将传入的对象拷贝一份
nonatomic:费原子特性,决定编译器生成的setter和getter方法是否非原子操作,atomic表示多线程安全,一般使用nonatomic,效率高。

18.NSString为什么要用关键字copy,如果用Strong会有说私什么问题?

1、用strong修饰不可变类型,例如:str1(NSString),使用str2(NSMutableString)赋值给str1,再修改str2的值,str1的值也会改变。strong让对象的引用计数加1,并返回当前对象的内容与地址。(指针地相同,内容是一份)
2、用copy修饰,str1(NSString),使用str2(NSMutableString)赋值给str1,再修改str2的值,str1的值不会改变。copy只是拷贝一份内容,并返回指针给str1,当修改str2时,str1内容不变。str1的地址与str2的地址是不一样的,是两份内容。

19.如何令自己写的对象具有拷贝功能?

如想让自己类具有copy方法,并且返回不可变类型,必须遵循NSCopying协议,并实现copyWithZone:(NSString)zone。如想让自己类具备NSMutableCopy方法,并且返回可变,必须遵循NSMutableCopying,并且实现-(void)MutableCopyZone:(nulltable NSZone*)zone;

##20.为什么IBOutle修饰的UIView也适用weak关键字?
在XIB或者SB控件时,其实控件就是加载到父控件的subViews数组中,进行强引用,使用weak为了不造成循环引用。

21.nonatomic与atomic区别?atomic能绝对保证线程安全吗?如不是,应如何实现?

nonatomic:非原子,不安全,但效率高
atomic:原子,安全,但效率低
atomic不能绝对保证线程安全。当前线程访问时,会造成线程不安全,可使用线程锁来保证线程安全。

22.用SB开发有何弊端,如何避免?

简单逻辑界面开发,使用SB开发,开发比较快
但当逻辑比较复杂的界面,开发就比较慢了,不不适用多人开发,不利于版本更新和后期的维护,使用SB编译时,直接加载到内存中,造成内存浪费
可用XIB代替,复杂的逻辑界面可使用纯代码编写

23.可变集合类和不可变集合类的copy与mutableCopy有什么区别?

可变使用copy表示深拷贝,不可变使用copy表示浅拷贝。不可变使用mutableCopy表示深拷贝。当浅拷贝,容器内容不可复制(只复制指针地址)。深拷贝,容器内容都会收到一条copy消息,拷贝出新的尼内容,重新组成新容器返回

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

进程:是具有一定独立功能的程序,关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
线程:进程的一个实体,是CPU调度和分派的基本单位,它比进程更小的能独立运行的基本单位。线程自己基本不用有系统资源,只拥有一点运行中必不可少的资源,但它与同属一个进程的其他线程共享所拥有的全部资源。
同步:阻塞当前线程操作,不能开辟线程
异步:不阻碍线程继续操作,可以开辟线程执行任务
并发:当有多个线程操作时,系统只有一个CPU,不可能真正同时进行一个以上的线程,它只有把CPU运行时间划为若干个时间段,再讲时间段分配给各个线程执行。在一个时间段代码运行时,其他线程处于挂起状态,这种方式称为并发
并行:当系统有一个及以上的CPU,线程操作有可能非并发。当一个CPU执行一个线程时,另一个CPU执行另一个线程,两个线程互不抢占CPU资源,可同时进行,称为并行
区别:并行,同一时间多个事件同时执行。并发:同一时间段多个事件发生

25.线程间通信?

当使用dispatch_async函数(异步)执行任务完成时,需要使用dispatch_async(dispatch_get_mian_queue,^());函数会回到主线程完成UI刷新,并完成通信

26.如何使用队列来便面资源抢夺

当我们使用多线程访问同一个数据时,有可能造成数据不准确性。这时使用线程锁绑定,也可以用串行队列完成

27.数据持久化几个方案

plist:存储字典、数组比较好用
preference:偏好设置,实质也是plist
NSKeyedArchiver:归档,可存储对象
Sqlite:数据库,经常使用第三方来操作(FMDB)
CoreData:数据存储,官方

28.AppDelegate几个方法?从后台到前台调用哪些方法?第一次启动调用哪些?从前台到后台调用哪些方法?

点击图标 –> 执行main函数 –> 通过UIApplication函数 –> 初始化UIApplication对象并对它设置代理对象 –> UIApplication对象 –> 程序结束退出

对象代理:applicationDidFinishLauching(程序载入后) applicationDidEnterBackground(推送到后台) applicationWillReignActive(将进入非活动状态) applicationWillEnterBackground(从后台将进入前台) applicationDidBecomeActive(进入活动状态) applicationDidReceiveMemoryWarining(内存不足将终止)

29.NSCache优于NSDictionary的有几点?

1、NSCache可自动释放内存
2、NSCache线程安全,可在不同线程中添加,删除和查询缓存中的对象
3、缓存对象不会拷贝key对象

30.Objc使用什么机制管理对象内存?

使用内存管理计数器来管理内存。当内存管理计数器为0时,对象会被释放。

31.block实质,一共有集中block,什么情况下会生成?

block实质就是一个Object-C对象
block:存储位置,1、代码区;2、堆区;3、栈区;(ARC情况下会自动拷贝到堆区,因此ARC下只要堆区和栈区)。代码区:不访问栈区变量(如局部变量)且不访问堆区变量(alloc创建的对象),此时block存放在代码区。堆区:访问了处于栈区的变量,或者堆区的变量,此时block存放在堆区。需要注意实际放在栈区,在ARC情况下自动拷贝到堆区,如不是ARC则存在放栈区。所在函数执行完毕就会释放。想在外面调用需要用copy指向它,这样就拷贝到堆区strong属性不会拷贝,会造成野指针错区。

32.为什么默认情况下无法修改被block捕获的变量?__block都做了什么?

默认情况下,block里的变量,拷贝进去是变量的值,而不是指向变量的指针。
当使用__block修饰后的变量,拷贝到block里面就是指向变量的指针,所以我们可以修改变量的值

33.Objc在向一个对象发送消息时,发生了什么?

根据对象的isa指针找到了类对象id,在查询类对象里面的methodLists方法函数列表,如果没有在,再沿着superClass寻找父类,再在父类methodLists方法的列表中查询,最终找到SEL,根据SEL确认IMP(指针函数),再发送消息。

34.block和weak修饰符的区别?

1、block不管是MRC还是ARC都可以使用,不仅可以修饰对象也可以修饰数据类型
2、
weak只能在ARC模式下使用,也只能修饰对象
3、block对象可在block中被赋值,而weak不行

35.什么时候报unrecognized selector 错误?iOS什么机制可以避免?

当发送消息时,会根据类里面的methodLists列表去查询我们动用的SEL,当查询不到时,我们一直沿着父类查询,最终查询不到时,会报此错误。查询不到方法调用+(void)resolveInstancemethod:(SEL)sel动态解释方法来给我一次机会添加,调用不到方法,可以再用-(void)forwardingForSelector:(SEL)selector重定向的方法来告诉系统,该用什么方法,保证不会崩溃。

36.常见HTTP状态码有哪些?

302请求重定向;500以上服务器错误;400以上请求连接错误或者找不到服务器;200以上正确;100以上请求接收成功

37.static关键字的作用?

1、函数体内static变量的作用范围为该函数体不同于auto变量,该变量只被分配一次,因此其值在下次调用时仍维持上一次的值。
2、在模块内的static全局变量可以被模块所用函数所访问,但不能改变模块外的其他函数访问

38.OC能多继承么?

OC中类不能多继承,可实现多个接口,通过多个接口完成C++多重继承,category为类别,重写一个类用分类好,category去重写类的方法,仅对本category有效,不会影响其他类和原有类的关系

39. #import和、#include和@class

1、#import是OC导入OC头文件的关键字,#include是C/C++导入头文件的关键字。使用#import只导入一次,不会重复导入
2、@class告诉编译器某个类的声明,执行时,才去查看类的实现文件,可解决头文件的相互包含,#import<>用来包含系统文件,#import””用来包含用户头文件

40.redwrite、readOnly、assgin、retain、copy、nonatomic

redwrite:表示可读可写,生成getter和setter方法
readOnly:表示只读,只生成getter,不生成setter
assgin:表示赋值特性,setter方法将参数赋值给实例变量,仅设置变量时
retain:表示持有特性,setter方法传入参数保留,再赋值传入参数的retaincount会+1
copy:表示赋值特性,setter方法将传入的对象复制一份,再赋值传入的参数的retaincount会+1
nonatomic:非原子操作,atomic表示多线程安全,一般使用nonatomic

41.id声明的对象有什么特性?

id声明的对象具有运行时的特性,既可以指向任何类型的OC对象

42.OC的内存管理,看法与解决方法?

自动计数器,这个方式与java相似,在程序运行时,始终自动释放,alloc-init 方式创建,retain加一,release减一
手动内存计数,自己创建自己销毁

43.类别作用?继承和类别在实现中的区别?

类别有三个作用:①将类的实现分散到不同文件或者不同框架中。②创建对私有方法的前向引用。③向对象添加非正式协议
集成可以增加,修改或者删除方法,并且可以增加属性

44.Block和delegate的区别

Block比delegate的成本高,因为block需要将数据从栈内复制到堆内,对象计数会增加,直到使用完成,block置nil才能消除,而delegate只是保留对象指针,直接回调就可以
block轻量级
delegate重量级,易造成循环引用

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

1、尽量使用https;2、不要传输明文密码;3、post并不比get安全;4、不要使用301跳转;5、http请求头带上MAC;6、http请求使用临时密钥;7、AES使用CBC模式

46.mian()之前的过程有哪些?

1、dyld开始将程序二进制文件初始化
2、交由ImageLoader读取image,其中包括我们的类,方法等各种符号(class,protocol,selector,IMP)
3、由于runtime向dyld绑定回调,当image加载到内存后,dyld会通知runtime进行处理
4、runtime接手后调用map-image做解析处理
5、接下来load-image中调用call-load-methods方法遍历所有加载进来的class,按集成层析依次调用class的+load和其他category的+load方法
6、至此所有信息都被加载到内存卡
7、最后dyld调用真正的main函数

47.设计模式哪几种

设计模式一种编码经验,用比较成熟的逻辑处理某类型的事

①MVC:model-view-controller 模型-视图-控制器进行解耦和编写;②MVVM:model-view-viewModel把 模型视图,业务逻辑层进行解耦和编写;③单例模式:通过static关键字,声明全局变量,在整个过程运行期间只会被赋值一次;④观察者模式:KVO是典型的通知模式,观察某个属性状态发生变化时通知观察者;⑤委托模式:代理+协议,实现一对一反向传值操作;⑥工厂模式:通过一个方法,批量的根据已有模板生产对象

48.frame和bounds的区别

frame:该view在父类view坐标中位置和大小;bounds是该view在自身坐标的位置和大小

49.OC的类可多重继承吗?可以实现多个接口吗?Category是什么?重写一个类的方法用继承好还是分类好?为什么?

OC的类不可以多重继承,可以实现多个接口,category是类别,一般情况用分类好,用category去重写类方法,仅对本category有效,不会影响其他类以及原有类的关系。

50.@property本质是什么?ivar、getter、setter、如何生成并添加到这个类中?

@property = ivar+getter+setter
属性两大概念:ivar(实例变量)、getter+setter(存取方法)
属性作为OC一项特性,主要的作用在于封装对象的数据。OC对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”来访问。其中,“存取方法”(getter)读取变量,而“设置方法”setter用于写入变量。

51.什么情况用weak关键字,相比assgin有什么不同?

1、在ARC中,在有可能出现循环引用的时候,往往通过让其中一端使用weak来解决,比如delegate属性
2、自身已经对它进行一次强引用,没有必要再强引用一次,此时也会用weak,自定义IBOutle控件属性一般也是用weak,当然也可以使用strong。
IBOutle连线出来的视图属性设置为weak,因为父控件的subViews数组已经对它有一个强引用:
不同点:assgin可以用非OC对象,而weak必须用于OC对象;weak表明该属性定义了一种“非拥有关系”。在属性所指的对象销毁时,属性会自动清空(nil)。

52.怎么用copy关键字

1、NSString、NSArray、NSDictionary常用copy,是因为它们有对应的可变类NSMutableString、NSMutableArray、NSMutableDictionary
2、block也常用copy

53.NSString、NSArray、NSDictionary为什么常用copy?如果用strong会如何?

因为它们有相应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,它们之间可能进行赋值操作(就是把可变赋值给不可变的)为确保对象中的字符中的值不会无意间的而变动,应该在设置新属性时先拷贝一份
1、因为父类指针可以指向子类对象,使用copy目的是为了让本队形的属性不受外界影响,使用copy无论给我传入一个可变对象还是不可变对象,我本身持有对象就是不可变副本。
2、如果我们使用strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改,那么会影响该属性
总结:使用copy的目的是为了防止可变类型的对象赋值给不可变类型的对象,可变类型的对象的值发送变化会无意间篡改不可变类型对象原来的值。

54.深拷贝与浅拷贝的区别?

浅拷贝:只复制对象的指针,不复制对象本身
深拷贝:复制对象本身,内存中有存在两个独立的对象本身,当修改A,A_copy不会变

55.系统对象的copy与mutableCopy方法?

不管是集合对象(NSArray、NSDictionary、NSSet……之类)的对象还是非集合对象(NSString,NSNumber)接受到 copy和mutableCopy消息时,都遵循以下准则:
①copy返回时不可变对象;如果copy返回值调用mutable对象方法时就carsh
②mutableCopy返回可变对象
一、在非集合对象中不可变copy是指针复制,mutableCopy是内容复制;可变都是内容复制
二、集合对象中,不可变copy是指针复制,mutableCopy是内容复制;可变都是内容复制,但是集合对象复制仅限于本身,对于其中元素仍然是指针复制
总结:只有对不可变进行copy操作是指针复制(浅拷贝)其他都是内容复制(深拷贝)

56.@property(nonatomic,copy) NSMutableArray *arr;将copy改为mutablecopy会出什么问题?

添加,删除,修改数组内元素时,程序会因为找不到对应方法而carsh
copy是复制一个NSArray对象,而NSArray对象无法进行添加修改

57.如何让自己的类用copy修饰符,如何重写带copy关键字的setter?

1、需要声明遵循NSCopying协议
2、实现NSCopying协议的方法,该方法只有一个方法:-(id) copyWithZone:(NSZone *)zone,使用copy修饰符,调用copy方法,其实真正实现CopyWithZone方法

58.@synthesize和@dynamic分别什么作用?

@property有这两个对应的词,默认是@synthesize,它是如果没有手动生成setter和getter方法会帮忙主动加上,而@dynamic只能手动生成

59.常见的OC数据类型有哪些?与C的基本数据类型有什么区别?比如:NSInteger和int

OC数据类型:NSString、NSNumber、NSArray、NSMutableArray、NSData等这些都是class,创建后便是对象。C语言基本数据类型是int,只是一定字节的内存空间,用于存放数值;NSIntger是基本数据类型Int或Long的别名,区别在于NSInteger会根据系统是32位还是64位来决定本身是int或long

60.id声明对象的特性?

id声明对象具有运行时特性,可指向任意类型的OC对象

61.OC如何内存管理?看法与解决方案

OC内存管理三种方式:ARC、MRC、内存池
①ARC:自动内存计数,由Xcode自动在APP编译阶段,在代码中添加内存管理代码
②MRC:手动内存计数,遵循内存管理谁申请,谁持有,谁释放
③内存池:ReleasePool,把需要释放的内存统一放在一个池子中,当池子被抽干(drain),池子中的所有内容也被自动释放,内存池操作为手动与自动,自动释放runpool机制影响

62.OC创建线程方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码是什么方法?

三种创建:NSThread、GCD的dispath、子类化的NSOperation然后加入NSOperationQueue
主线程:performSelectorOnMainThread
延时:performSelector:OnThread:withObject:waitUntilDone;

63.category(类别)Extension(扩展)和继承的区别

①分类有名字,类扩展没有名字,是一种特殊的分类
②分类只能扩展方法(属性仅仅声明,并未真的实现),类扩展可以扩展属性,成员变量和方法
③继承可以增加,修改,删除方法,并且可以增加属性

64.OC是动态运行时语言是什么意思?

主要讲数据类型的确定由编译时,推迟到了运行时,简单的说,运行机制使我们直到运行时才去决定一个对象的类别,以及调用该对象指定方法

65.为啥我们常见的delegate属性都用weak而不是retain/strong?

为了防止delegate两端产生不必要的循环使用

66.什么时候用Delegate,什么时候用Notification

Delegate(委托模式):1对1,反向消息通知功能
Notification(通知模式):只想要把消息传出去,告知某些状态的变化

67.KVO、KVC是什么?

KVO:键值编码是一种通过字符串间接访问对象的方式
KVC:键值观察机制,提供了观察某一属性变化的方法,极大简化代码

68.KVC底层实现

当一个对象调用setValue方法时,方法内部操作
①检查是否存在相应的Key的set方法,如存在就调用setter
②如果set方法不存在,就查找与Key相同名称并且带下划线的成员变量,如果有则直接给成员变量属性赋值
③如果没有找到_key,就查找相同名称的属性key,如有则直接赋值
④如果还没有,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法,这些方法实则都是抛出异常,可以根据需要重写

69.ViewController生命周期

1、initWithCoder:通过nib文件初始化时触发
2、awakeForNib:nib文件被加载时,发送awakeForNib消息给文件美每个对象
3、loadView:开始加载视图控制器自带view
4、viewDidload:视图控制器的view被加载完成
5、viewWillAppear:视图控制器的view将被显示在window上
6、updateViewConstrains:试图控制器的view开始更新AutoLayout约束
7、viewWillLayoutSubViews:试图控制器的view将更新内容视图的位置
8、viewDidLayoutSubViews:视图控制器的view已经更新试图位置
9、viewDidAppear:视图控制器的veiw已展示在window上
10、viewWillDisappear:视图控制器的view将从window上消失
11、viewDidDisappear:视图控制器的view已从widow上消失

70.方法和选择器有什么区别?

selector是方法的名字,方法是以一个组合体,包含名字和实现

71.你是否接触过OC中的反射机制?简单聊一下概念和使用

①class 反射
Class class = NSClassFromString(@”student”);
Student dtu = [[Class alloc]init];
将类名变为字符串
Class class = [Student class];
NSString
className = NSStringFromClass(class);
②SEL反射
通过方法的字符串形式实例化方法
SEL selector = NSSSelectorFromString(@”setName”);
[stu performSelector:selector withObject:@”Mike”];
将方法变成字符串
NSStringFromSelector(@selector *(setName));

72. 调用方法两张方式

①直接通过方法名调用[Person show];
②间接通过SEL数据来调用SEL aaa = @selector(show);[Person performSelector:aaa];

73.类变量的@public,@protected,@private,@package声明各有声明含义?

@public :任何地方都可以访问
@protected :该类和子类中访问,是默认的
@private :只能在本类中访问
@package :本包内使用,跨包不行

74.什么是谓词?

谓词是通过NSPredicate给定的逻辑条件来作为约束条件,完成对数据的筛选
//定义谓词对象,谓词对象中包含了过滤条件(过滤条件比较多)
NSPredicate predicate = [NSPedicate predicateWthForm:@”age%d”,30];
//使用谓词条件过滤数组中的元素,过滤之后返回查询的结果
NSArray
array = [persons filteredArrayUsingPredicate:predicate];

75.指针问题

isa:是一个Class类型的指针,每个实例对象有个isa的指针,它指向对象的类,而class里也有个isa的指针,它指向meteClass(元类)。元类保存了类方法的列表。当类方调用时,先会从本身查找类方法的实现,如没有,元类会向它父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针最终指向一个根元类(root meteClass)。根元类的isa指针指向本身,这样形成一个闭环。

76.如何访问并修改一个类的私有属性?

①一种是通过KVC获取
②通过runtime访问修改私有属性

77.isKindOfClass,isMemberOfClass,selector作用分别是?

isKindOfClass:作用是某个对象属于某个类型或者继承自某类型
isMemberOfClass:某个对象确切属于某个类型
selector:通过方法名,获取在内存中的函数的入口地址

78.你经常使用一些第三方库有哪些?

1.AFNetworking

2.SDWebImage

3.FMDB (没怎么用,得学习)

4.JSONKit

5.MJRefresh

6.MJExtension(需要再复习)

7.Masonry

8.友盟,shareSDK等三方库。

79.你经常用的设计模式有哪些?

1.MVC

2.代理模式 (Delegate)

3.观察者模式 (NSNotification/KVO)

4.单例模式 (需要多使用)

5.工厂模式 – 简单工厂,工厂方法, 抽象工厂三种设计模式(需要多使用)

80.本地存储有哪些方式?

1.属性列表(NSUserDefault 或 plist)

2.对象归档 (NSKeyedArchiver)

3.SQLite

4.CoreData