先记录 以后慢慢答

1、iOS 应用导航模式有哪些?

2、iOS 中持久化方式有哪些?

3、iOS 单元测试框架有哪些?

4、iOS 7层协议,tcp四层协议及如何对应的?

5、iOS 你在项目中用过 runtime 吗?举个例子

6、iOS 什么是ARC?

7、iOS 说明并比较关键词:atomatic, nonatomic

8、iOS 说明并比较关键词:strong, weak, assign, copy

9、iOS 说明并比较关键词:__weak,__block

10、iOS 什么情况下会出现循环引用?

11、iOS 类(class)和结构体(struct)有什么区别?

12、iOS 什么是KVO和KVC?他们的使用场景是什么?

13、iOS 通知和协议有哪些不同之处?

14、iOS 应用有哪些方式保存本地数据?他们都应用在哪些场景?

15、iOS 内存的使用和优化的注意事项?

16、iOS UIViewController的完整生命周期?

17、iOS 队列和多线程的使用原理?

18、iOS SQLite中常用的SQL语句?

19、iOS frame和bounds有什么不同?

20、iOS view的touch事件有哪些?

21、iOS 中的响应者链的工作原理?

22、iOS property属性的修饰符的作用?

23、iOS 对于Run Loop的理解?

24、iOS @synthesize、@dynamic的理解?

25、iOS 对瀑布流的理解?

26、iOS 单例模式理解与使用?

27、iOS 对沙盒的理解?

28、iOS 三方库SDWebImage原理?

29、iOS 网络七层协议?

30、iOS 如何进行网络消息推送?

31、iOS SVN的使用?

32、iOS 简述APP发布的上架流程?

33、iOS 如何进行真机调试?

34、iOS XML数据解析方式各有什么不同,JSON解析有哪些框架?

35、iOS ASIHttpRequest、AFNetWorking之间的区别?

36、iOS HTTP协议的特点,关于HTTP请求GET和POST的区别?

37、iOS Scoket连接和HTTP连接的区别?

38、iOS TCP连接的三次握手?

39、iOS TCP和UDP的区别于联系?

40、iOS Apple设备尺寸和编程尺寸?

41、iOS 线程与进程的区别和联系?

42、iOS 定时器与线程的区别?

43、iOS 使用block有什么好处?使用NSTimer写出一个使用block显示(在UILabel上)秒表的代码?

44、iOS 解决cell重用的问题?

45、iOS 怎样使用performSelector传入3个以上参数,其中一个为结构体?

46、iOS 解释self = [super init]方法?

47、iOS 在某个方法中 self.name = _name,name = _name 它 们有区别吗,为什么?

48、iOS Core Data的6成员对象?

49、iOS iOS 开发中数据持久性有哪几种?

50、iOS isMemberOfClass 和 isKindOfClass 联系与区别?

51、iOS @public、@protected、@private 它们的含义与作用?

52、iOS #include与#import的区别、#import 与@class 的区别?

53、iOS static、self、super关键字的作用?

54、iOS NSNotification、Block、Delegate和KVO的区别?

55、iOS 代理的作用?

56、iOS 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)?

57、iOS 循环引用的产生原因,以及解决方法?

58、iOS 类别的作用?

59、iOS 简述类目category优点和缺点?

60、iOS 简述内存管理基本原则?

61、iOS OC的理解与特性?

62、iOS 你在项目中用过 GCD 吗?举个例子

63、iOS Category 的实现原理,以及 Category 为什么只能加方法不能加属性?

64、iOS block 的原理,block 的属性修饰词为什么用 copy,使用 block 时有哪些要注意的?

65、iOS 的热更新方案有哪些?介绍一下实现原理?

66、iOS class A 继承 class B,class B 继承 NSObject。画出完整的类图?

67、iOS 细致地讲一下事件传递流程?

68、iOS main()之前的过程有哪些?

69、iOS Category 中有 load 方法吗?load 方法是什么时候调用的?load 方法能继承吗?

70、iOS 讲一下你对 iOS 内存管理的理解?

71、iOS 你在项目中是怎么优化内存的?

72、iOS 讲讲 RunLoop,项目中有用到吗?

73、iOS 列表卡顿的原因可能有哪些?你平时是怎么优化的?

74、iOS 项目有没有做过组件化?或者你是否调研过?

75、iOS 讲一下 OC 的消息机制?

76、iOS ARC 都帮我们做了什么?

77、iOS 实现 isEqual 和 hash 方法时要注意什么?

78、iOS 线程安全的处理手段有哪些?把你想到的都说一下?

79、iOS 说一下 OperationQueue 和 GCD 的区别,以及各自的优势?

80、iOS Swift 中 struct 和 class 的区别?

81、iOS Swift 是如何实现多态的?

82、iOS Swift 和 OC,各自的优缺点有哪些?

83、iOS 如果让你实现 NSNotificationCenter,讲一下思路?

84、iOS 如果让你实现 GCD 的线程池,讲一下思路?

85、iOS 为什么是三次握手?为什么是四次挥手?三次挥手不行吗?

86、iOS 讲一下 HTTPS 密钥传输流程?

87、iOS 讲讲 MVC、MVVM、MVP,以及你在项目里具体是怎么写的?

88、iOS 系统框架里使用了哪些设计模式?至少说6个?

89、iOS 你自己用过哪些设计模式?

90、iOS 哪一个项目技术点最能体现自己的技术实力?具体讲一下

91、iOS 你在项目中遇到的最大的问题是什么?你是怎么解决的?

92、iOS 用 Alamofire 比直接使用 URLSession,优势是什么?

93、你是如何学习 iOS 的?

94、iOS 和产品经理、测试产生冲突时,你是怎么解决的?

95、iOS 手写一下快排?

96、iOS 遍历一个树,要求不能用递归?

97、iOS 找出两个字符串的最大公共子字符串?

98、iOS 为什么说Objective-C是一门动态的语言?

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

100、iOS 用StoryBoard开发界面有什么弊端?如何避免?

101、iOS GCD的一些常用的函数?(group,barrier,信号量,线程同步)?

102、iOS block的实质是什么?一共有几种block?都是什么情况下生成的?

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

104、iOS 模拟一下循环引用的一个情况?block实现界面反向传值如何实现?

105、iOS 什么时候会报unrecognized selector错误?iOS有哪些机制来避免走到这一步?

106、iOS objc在向一个对象发送消息时,发生了什么?

107、iOS 能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么

108、iOS runtime如何实现weak变量的自动置nil?

109、iOS 给类添加一个属性后,在类结构体里哪些元素会发生变化?

110、iOS runloop是来做什么的?runloop和线程有什么关系?主线程默认开启了runloop么?子线程呢?

111、iOS runloop的mode是用来做什么的?有几种mode?

112、iOS 苹果是如何实现Autorelease Pool的?

113、iOS 为什么把NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环以后,滑动scrollview的时候NSTimer却不动了?

114、iOS isa指针?(对象的isa,类对象的isa,元类的isa都要说)

115、iOS 运行时能增加成员变量么?能增加属性么?如果能,如何增加?如果不能,为什么?

116、iOS objc中向一个nil对象发送消息将会发生什么?(返回值是对象,是标量,结构体)

117、iOS UITableview的优化方法(缓存高度,异步绘制,减少层级,hide,避免离屏渲染)

118、iOS 有没有用过运行时,用它都能做什么?(交换方法,创建类,给新创建的类增加方法,改变isa指针)

119、iOS 看过哪些第三方框架的源码?都是如何实现的?(如果没有,问一下多图下载的设计)

120、iOS KVC的使用?实现原理?(KVC拿到key以后,是如何赋值的?知不知道集合操作符,能不能访问私有属性,能不能直接访问_ivar)

123、iOS UITableViewCell上有个UILabel,显示NSTimer实现的秒表时间,手指滚动cell过程中,label是否刷新,为什么?

124、iOS 有a、b、c、d 4个异步请求,如何判断a、b、c、d都完成执行?如果需要a、b、c、d顺序执行,该如何实现?

125、iOS 一个view已经初始化完毕,view上面添加了n个button,除用view的tag之外,还可以采用什么办法来找到自己想要的button来修改button的值?

126、iOS 浅复制和深复制的区别?

127、iOS MVC设计模式是什么? 你还熟悉什么设计模式?他们和MVC有什么不同的地方?

128、 iOS 内存管理的几条原则时什么?按照默认法则.哪些关键字生成的对象需要手动释放?在和property结合的时候如何有效的避免内存泄露?

129、iOS Objective-C如何对内存管理的,说说你的看法以及你遇到的问题以及解决方法?

130、iOS 以scheduledTimerWithTimeInterval的方式触发的timer,在滑动页面上的列表时,timer会暂停,为什么?该如何解决

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

132.为什么IBOutlet修饰的UIView也适用weak关键字?
在xib或者Sb拖控件时,其实控件就加载到了父控件的subviews数组里面,进行了强引用,即使使用了weak,也不造成对象的释放。

133.用StoryBoard开发界面有什么弊端?如何避免?
使用简单逻辑页面的跳转是可以使用sb的,开发比较块。
但是SB对于逻辑项目比较复杂的时候,开发起来比较慢。不适合多人合作开发;也不利于版本的梗系和后期的维护。使用sb在项目变异编译的时候,也都会直接加载到内存中,造成内存的浪费。
可以使用xib来代替,编辑复杂逻辑界面时候可以使用纯码编写。

134.GCD的一些常用的函数?(group,barrier,信号量,线程同步)

  1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

答:Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

136.#import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?

答:#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。

137.这段代码有什么问题吗:

答:@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end

正确写法
{
if(_age){
[_age release];
}
_age = [newAge retain];

}
死循环(扩展:知道如何正确写setter和getter方法)

  1. 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用?

答readwrite 是可读可写特性;需要生成getter方法和setter方法时
readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;copy表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic

139.截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的数据,分别输出它们。

componentsSeparatedByString
NSString * str = @“20|http://www.baidu.com”;
for(NSString*s in [str componentsSeparatedByString]){
NSLog(@“%@“,s);
}

140.指出下面代码的问题

- (void)willEndStepOne:(NSObject *)userInfo{ 
   [NSThread detachNewThreadSelector:@selector(doSomeThing:) toTarget:self withObject:userInfo];}
- (void)doSomeThing:(NSObject *)userInfo{   
 for (int i=0; i<max_loop_times; i++) {    
    NSString *tmpString = [NSString stringWithFormat:@"%d", randNum];     
  }
  }

141.分析json、xml的区别?json、xml解析方式的底层是如何处理的?

http://www.open-open.com/bbs/view/1324367918671
http://hi.baidu.com/fevelen/item/a25253ab76f766756cd455b6

142.Objective-C如何对内存管理的,说说你的看法和解决方法?

Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。

143.内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象

需要手动释放?在和property结合的时候怎样有效的避免内存泄露?
谁申请,谁释放
遵循Cocoa Touch的使用原则;
内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。
关键字alloc 或new 生成的对象需要手动释放;
设置正确的property属性,对于retain需要在合适的地方释放,

144.What is lazy loading?

懒汉模式,只在用到的时候才去初始化。也可以理解成延时加载。我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。一个延时载,避免内存过高,一个异步加载,避免线程堵塞

145.NSCache优于NSDictionary的几点?
1.nscache 是可以自动释放内存的。
2.nscache是线程安全的,我们可以在不同的线程中添加,删除和查询缓存中的对象。
3.一个缓存对象不会拷贝key对象。

146.runloop是来做什么的?runloop和线程有什么关系?主线程默认开启了runloop么?子线程呢?
runloop:字面意思就是跑圈,其实也就是一个循环跑圈,用来处理线程里面的事件和消息。
runloop和线程的关系:每个线程如果想继续运行,不被释放,就必须有一个runloop来不停的跑圈,以来处理线程里面的各个事件和消息。
主线程默认是开启一个runloop。也就是这个runloop才能保证我们程序正常的运行。子线程是默认没有开始runloop的

147.runloop的mode是用来做什么的?有几种mode?
model:是runloop里面的模式,不同的模式下的runloop处理的事件和消息有一定的差别。
系统默认注册了5个Mode:
(1)kCFRunLoopDefaultMode: App的默认 Mode,通常主线程是在这个 Mode 下运行的。
(2)UITrackingRunLoopMode: 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响。
(3)UIInitializationRunLoopMode: 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
(4)GSEventReceiveRunLoopMode: 接受系统事件的内部 Mode,通常用不到。
(5)kCFRunLoopCommonModes: 这是一个占位的 Mode,没有实际作用。
注意iOS 对以上5中model进行了封装
NSDefaultRunLoopMode;
NSRunLoopCommonModes

148.为什么把NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环以后,滑动scrollview的时候NSTimer却不动了?
nstime对象是在 NSDefaultRunLoopMode下面调用消息的,但是当我们滑动scrollview的时候,NSDefaultRunLoopMode模式就自动切换到UITrackingRunLoopMode模式下面,却不可以继续响应nstime发送的消息。所以如果想在滑动scrollview的情况下面还调用nstime的消息,我们可以把nsrunloop的模式更改为NSRunLoopCommonModes

149.苹果是如何实现Autorelease Pool的?
Autorelease Pool作用:缓存池,可以避免我们经常写relase的一种方式。其实就是延迟release,将创建的对象,添加到最近的autoreleasePool中,等到autoreleasePool作用域结束的时候,会将里面所有的对象的引用计数器-1.
autorelease

150.进程和线程的区别和联系
这个其实是操作系统的问题,当时一下子把我问的懵了,后来仔细回想了一下,加上自己的理解就答了,下面说说稍微完整的答案,大家可以准备准备,再问这种问题就可以完美作答了。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

151.并行和并发的区别

并行是指两个或者多个事件在同一时刻发生;

并发是指两个或多个事件在同一时间间隔内发生。

152.谈谈你对Block和delegate的理解
我当时是这么答的,delegate的回调更多的面向过程,而block则是面向结果的。如果你需要得到一条多步进程的通知,你应该使用delegation。而当你只是希望得到你请求的信息(或者获取信息时的错误提示),你应该使用block。(如果你结合之前的3个结论,你会发现delegate可以在所有事件中维持state,而多个独立的block却不能)

153.谈谈instancetype和id的异同
1、相同点

都可以作为方法的返回类型

2、不同点

①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;②instancetype只能作为返回值,不能像id那样作为参数

5.category中能不能使用声明属性?为什么?如果能,怎么实现?

这种问题一问,我当时就感觉肯定能实现的,但是实在不知道怎么做,后来回来查了一下,才知道是用到了Runtime的知识了。贴一下答案

给分类(Category)添加属性

利用Runtime实现getter/setter 方法

@interface ClassName (CategoryName)@property (nonatomic, strong) NSString *str;@end//实现文件#import “ClassName + CategoryName.h”#importstatic void *strKey = &strKey;

@implementation ClassName (CategoryName)

-(void)setStr:(NSString *)str

{

objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);

}

-(NSString *)str

{

return objc_getAssociatedObject(self, &strKey);

}

@end

154.isKindOfClass和isMemberOfClass的区别
这个题目简单,但是就是当时紧张的情况下,别答反了。

isKindOfClass来确定一个对象是否是一个类的成员,或者是派生自该类的成员

isMemberOfClass只能确定一个对象是否是当前类的成员

155.block里面的如何防止retain cycle
使用弱引用打断block里面的retain cycle

MRC中 _block 是不会引起retain;但在ARC中 _block 则会引起retain。ARC中应该使用 _weak或__unsafe_unretained弱引用

156.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。

157.谈谈NSString的时候用copy和strong的区别?
这个题目当时问出来,真的是一下子就傻了,平时虽然用的多,但是真的没有注意比较过他们俩,看来平时学习还是多要问问所以然!

158.Core Data是数据库么?有哪些重要的类?
我当时一看问到是不是的问题,我就留神,感觉应该不是常理的,当时仔细想了想,Core Data确实不是一个数据库,只是把表和OC对象进行的映射,当时并不是进进映射那么简单,底层还是用的Sqlite3进行存储的,所以Core Data不是数据库。

有以下6个重要的类:

(1)NSManagedObjectContext(被管理的数据上下文)

操作实际内容(操作持久层)

作用:插入数据,查询数据,删除数据

(2)NSManagedObjectModel(被管理的数据模型)

数据库所有表格或数据结构,包含各实体的定义信息

作用:添加实体的属性,建立属性之间的关系

操作方法:视图编辑器,或代码

(3)NSPersistentStoreCoordinator(持久化存储助理)

相当于数据库的连接器

作用:设置数据存储的名字,位置,存储方式,和存储时机

(4)NSManagedObject(被管理的数据记录)

相当于数据库中的表格记录

(5)NSFetchRequest(获取数据的请求)

相当于查询语句

(6)NSEntityDescription(实体结构)

相当于表格结构

157。 ViewController生命周期

按照执行顺序排列:
1. initWithCoder:通过nib文件初始化时触发。
2. awakeFromNib:nib文件被加载的时候,会发生一个awakeFromNib的消息到nib文件中的每个对象。
3. loadView:开始加载视图控制器自带的view。
4. viewDidLoad:视图控制器的view被加载完成。
5. viewWillAppear:视图控制器的view将要显示在window上。
6. updateViewConstraints:视图控制器的view开始更新AutoLayout约束。
7. viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置。
8. viewDidLayoutSubviews:视图控制器的view已经更新视图的位置。
9. viewDidAppear:视图控制器的view已经展示到window上。
10. viewWillDisappear:视图控制器的view将要从window上消失。
11. viewDidDisappear:视图控制器的view已经从window上消失

158 设计模式是什么? 你知道哪些设计模式,并简要叙述?

设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情。
1). MVC模式:Model View Control,把模型 视图 控制器 层进行解耦合编写。
2). MVVM模式:Model View ViewModel 把模型 视图 业务逻辑 层进行解耦和编写。https://www.jianshu.com/p/f1d0f7f01130
3). 单例模式:通过static关键词,声明全局变量。在整个进程运行期间只会被赋值一次。
4). 观察者模式:KVO是典型的观察者模式,观察某个属性的状态,状态发生变化时通知观察者。
5). 委托模式:代理+协议的组合。实现1对1的反向传值操作。
6). 工厂模式:通过一个类方法,批量的根据已有模板生产对象。

159、KVC的底层实现?

当一个对象调用setValue方法时,方法内部会做以下操作:
1). 检查是否存在相应的key的set方法,如果存在,就调用set方法。
2). 如果set方法不存在,就会查找与key相同名称并且带下划线的成员变量,如果有,则直接给成员变量属性赋值。
3). 如果没有找到_key,就会查找相同名称的属性key,如果有就直接赋值。
4). 如果还没有找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。
这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。
KVO基于runtime机制实现。

160、排序算法

选择排序、冒泡排序、插入排序三种排序算法可以总结为如下:

都将数组分为已排序部分和未排序部分。

  1. 选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。
  2. 冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。
  3. 插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。

161 5、折半查找(二分查找)

/**
 *  折半查找:优化查找时间(不用遍历全部数据)
 *
 *  折半查找的原理:
 *   1> 数组必须是有序的
 *   2> 必须已知min和max(知道范围)
 *   3> 动态计算mid的值,取出mid对应的值进行比较
 *   4> 如果mid对应的值大于要查找的值,那么max要变小为mid-1
 *   5> 如果mid对应的值小于要查找的值,那么min要变大为mid+1
 *
 */ 

// 已知一个有序数组, 和一个key, 要求从数组中找到key对应的索引位置 




int findKey(int *arr, int length, int key) {
    int min = 0, max = length - 1, mid;
    while (min <= max) {
        mid = (min + max) / 2; //计算中间值
        if (key > arr[mid]) {
            min = mid + 1;
        } else if (key < arr[mid]) {
            max = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}

猜你喜欢

转载自blog.csdn.net/sunzhenglin2016/article/details/80745397