序言
面试只是对个人技术及应变能力的一次考验。只有解决了一个问题,你才有机会遇见下一个问题。以下面试题由群友提供或网上收集整理,共勉。
欢迎大家加入小编的iOS交流群656315826,群里会提供相关面试资料,书籍欢迎大家入驻!大家一起交流成长!!
初级
1、下列哪个名词是不属于在UML类图的(D)
A、 类名 B、属性 C、操作 D、默认值
2、下列哪个关系描述的是聚合关系(B)
A、嘴巴 -- 头 B 、汽车 -- 引擎
C、大雁 – 翅膀 D、叶 -- 树
3、在OC中类的接口声明关键字为:(B)
A、@import B、@interface
C、@implemention D、@protocol
4、经过下列哪种操作后需要使用release方法(C)
A、delegate B、assign
C、retain D、dealloc
5、OC中,所有类的根类是:(A)
A、NSObject B、NSDate
C、NSCoding D、UIView
6、向Xcode控制台输出一个字符串应该用:(A)
A、NSLog() B、system.out.print()
C、NSPrintf() D、scanf()
7、必须实现的协议方法使用:关键字声明(C)
A、@property B、@interface
C、@required D、@protocol
8、OC中布尔(BOOL)类型的变量的值只有:(B)
A、1/0 B、YES/NO
C、true/false D、1/-1
9、在OC中,类中成员变量的可见度(访问权限)不包括:(D)
A、@public B、@protected
C、@private D、@optional
10、面向对象的特性不包括:(D)
A、封装 B、继承
C、多态 D、构造
11、类何时调用dealloc方法:(D)
A、[property release]后 B、[instance release]后
C、[super dealloc]时 D、当引用计数为0时.
12、简单类型的成员在使用@property()时,括号中应使用:(A)
A、assign B、copy C、retain D、auto
13、NSRange是什么数据类型:(C)
A、数组 B、字典
C、结构体 D、指针
14、实例变量默认的访问修饰符是:(C)
A、@public B、@private
C、@protected D、@package
15、关于协议描述不正确的是:(D)
A、协议分正式和非正式协议
B、在要求确认协议的类必须实现协议中的方法时,可以使用@required
C、一个协议可以被多个类确认
D、协议中声明的方法,默认是@optional的
16、NSMutableDictionary字典中删除对象可以使用下面那个方法:(D)
A、filteredArrayUsingPredicate: B、arrayByAddingObject:
C、initWithCapacity: D、setValue:forKey:
17、在Xcode中,需要编译混合Objective-C和C++的源码文件,需要将文件格式的后缀改为 (C)
A. .c B. .cpp C. .mm D. .m
18、下列哪项不属于数据持久化?(C)
A. 属性列表 B. Core Data
C. NSUserDefaults D. 归档和反归档
19、下面哪个类可以创建可变对象(C)
A.NSString B. NSArray
C. NSMutableDictionary D.NSSet
20、对于类和对象的概念,属性对象的是:(C)
A、奥迪A6 B、保龄球
C、世界冠军刘翔 D、西红柿
21、下面哪个方法不属于NSObject的内省方法(A)
A、init B、iskindOfClass
C、responseToselector D、isMemberOfClass
22、一个良好的算法由下面的基本结构组成,但不包括(D)
A、顺序结构 B、选择结构
C、循环结构 D、跳转结构
23、下面哪个方法可以比较两个字符串的异同(B)
A、if(str = str2) B、if([str1 isEqualToString:str2])
C、if(str1&&str2) D、if([str1 length] == [str2 length])
24、NSMutableDictionary *dic = [[NSMutableDictionary alloc ]
initWithObjectsAndKeys:@”1”,@”2”,@”2”,@”3”,@”4”,nil];
NSArray *arr = [[NSAarry alloc]initWithArray:[dic allKeys]];
NSString *str = [[NSString alloc]initWithFormat:[arr objectAtIndex:0],[arr objectAtIndex:1], [arr objectAtIndex:2]];
NSLog(@”%@”,str);输出结果是:(C)
A、123 B、234 C、2 D、3
25、下列哪个修饰符的对象被废弃后悔被自动赋值为nil?(C)
A、__strong B、__autoreleasing
C、__weak D、__unsafe_unretained
26、在SVN版本库浏览器中,使用(A)指令可以查看所选文件或目录的日志?
A、show log B、Rename C、Blame D、Save as
27、下列不是属性默认关键字的是(D)
A、readwrite B、assign C、atomic D、copy
28、NSString *name = [[NSString alloc]initWithString:@"张三"];
NSLog(@"%d",[name retainCount]);
上述代码打印结果是:(A)
A、-1 B、0 C、1 D、2
29、现有如下集合,能准确删除“张三”的代码是:NSMutableDictionary * peoples=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"张三",@"001",@"lisa",@"002",@"唐sir",@"老大哥", nil];
答案:(A)
A、[peoples removeObjectForKey:@"001"];
B、[peoples removeObject:@"张三"];
C、[peoples removeObjectAtIndex:0];
D、[peoples removeAllObjects];
30、NSArray *array = [NSArray arrayWithObjects:@"one", @"two", @"three",nil];
NSLog(@"%@",[array objectAtIndex:1]);
NSLog(@"%@",[array objectAtIndex:3]);
控制台中打印的最后一条信息会是:(D)
A、one B、two C、three D、崩溃信息
31、NSRange的成员变量有:(A)
A、location,length B、width,height
C、location,height D、length,width
32、关于NSSet描述正确的有:(B)
A、NSSet可以存放任何数据类型的数据
B、NSSet存放数据是无序的
C、NSSet可以通过下标获取数据
D、NSSet存放的数据是有序的
33、NSRange是什么数据类型:
答案:(C)
A、数组 B、字典 C、结构体 D、指针
34、关于协议描述不正确的是:(D)
A、协议分正式和非正式协议
B、在要求确认协议的类必须实现协议中的方法时,可以使用@required
C、一个协议可以被多个类确认
D、协议中声明的方法,默认是@optional的
35、以下对类的描述不正确的是:(C)
A、类的接口部分可以包含实例变量、属性和方法
B、可以把声明和实现都放到.h文件中
C、一对文件(Person.h Person.m)只能定义一个类//可以定义多个类
D、类比较抽象,对象比较具体
36、Objective-C 语言中类的实例变量如果只可以被本类和其子类访问,需要下列哪个修饰符:(C)
A、@public B、@private C、@protected D、@friendly
37、int a = 10;
NSNumber *b = [[NSNumber alloc] initWithInt:a];
NSLog(@"%d", a+++b);
这段代码的输出结果是什么:(D)
A、21
B、20
C、30
D、编译错误
38、下列选项中不能正常为emp的name属性赋值的代码有:(B)
A、emp.name=@"李嘉诚";
B、emp->name=@"李开复";
C、[emp setValue:@"柳传志" forKey:@"name"];
D、[emp setName:@"黄光裕"];
39、关于类与对象的说法正确的是(A)
A、一个文件中可以声明多个类
B、方法需要传递多个参数时,参数用逗号隔开
C、不是每个对象都有引用计数
D、Objective-C可以有多继承
中级
1、关于KVC的描述正确的是:(B)
A、KVC是指"Key-Value Observing"
B、是一种间接访问对象的属性的机制
C、只能访问对象的属性
D、当对象的属性值改变时,我们能收到一个通知
2、以下说法正确的是:(C)
A、求数组的内容的个数用length方法
B、字典是根据其位置来索引数据的
C、协议中定义的方法默认不是必须实现的
D、一个文件中可以声明多个类
3、下面说法错误的是(B)
A、GCD的开销要比NSThread大
B、可以在子线程中修改UI元素
C、NSOperationQueue是比NSthread更高层的封装
D、GCD可以根据不同优先级分配线程
4、下列哪个操作不会引起引用计数(retaincount)的变化是:(C)
A、NSString *str = [[NSString stringWithFormat:@"hello"];
B、NSMutableData *data = [NSMutableData allocWithZone:data1];
C、int a=1;
D、NSArray *arr = [[NSArray alloc]initWithArray:arr1];
5、多线程中栈与堆是公有的还是私有的(C)
A.栈公有,堆私有 B.栈公有,堆公有
C.栈私有,堆公有 D.栈私有,堆私有
6、以下哪个算法不是对称加密算法(D)
A.DES B.RC5 C.AES D.RSA
7、优秀的程序设计,应遵循下列哪个准则?(B)
A. 高内聚,高耦合 B. 高内聚,低耦合
C. 低内聚,高耦合 D. 低内聚,低耦合
8、对于runloop的理解不正确的是(C)
A、每个线程都有其对应的RunLoop
B、默认非主线程的RunLoop是没有运行的
C、在一个单独的线程中没有必要去启用RunLoop
D、可以将NSTimer添加到runLoop
9、下列选项不是MVVM模式特点的是(A)
A、高耦合 B、可重用性 C、可测试性 D、独立开发
10、对于Objective-C中的方括号“[]”的作用,下列说法错误的是:(D)
A、用于通知某个对象该做什么
B、方括号内第一项是对象,其余部分是你需要对象执行的操作
C、在Objective-C中通知对象执行某种操作,称为发送消息.(也叫调用方法)
D、方括号中可以为空
11、下列关于环信的说法错误的是(D)
A、环信是一个第三方平台,提供即时通信服务(IM)。
B、环信是在XMPP的基础上进行二次开发。
C、环信在网络上传输的数据也是XML
D、使用环信,需要自己搭建服务器
12、关于Socket,下列说法错误的是(A)
A、socket本身是一种协议,而不是接口
B、通过socket我们才能使用TCP/IP协议
C、TCP/IP协议是传输层协议,主要解决数据如何在网络中传输
D、socket是对TCP/IP协议的封装
13、关于git和svn的说法正确的是(B)
A、在很多其情况下,git的速率远远比SVN小
B、git是分布式管理,SVN是集中式管理
C、git用分支比较麻烦
D、git必须用网络并且服务器开启的情况下才可以使用
简答
问题1:请说明一下UML类图中组合与聚合的区别
答:聚合与组合都表示整体与部分的关系,只不过在聚合关系中,成员对象可以脱离整体对象独立存在,而在组合关系中,成员对象与整体对象之间具有同生共死的关系,例如头与嘴巴,如果头没了,那么嘴巴自然也不复存在。
问题2、OC有多继承吗?没有的话可以用什么方法替代?
答:多继承即一个子类可以有多个父类,它继承了多个父类的特性。OC的类没有多继承,只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现。protocal可以实现多个接口,通过实现多个接口可以完成多继承。Category一般使用分类,用Category去重写类的方法,仅对Category有效,不会影响到其他类与原有类的关系。
问题3:如果在block里面修改外部变量的值,会报错吗?
答:在默认情况下,不允许block内部修改外部变量的数值。因为拷贝之后它与原数值指向了不同的地址。若是能改变则会破坏代码的可读性。
问题4:下面是一段能正确运行的代码。为啥将外部变量定义成mutableString就能在block内部对其进行修改?
void demoBlock() { NSMutableString *strM = [NSMutableString stringWithString:@”张三”]; void(^myBlock)() = ^{ [strM setString:@”lisa”]; }; myBlock(); NSLog(@”%@”,strM); }
答案:在block中引用外部变量要拷贝一份到堆中。
这个时候拷贝到堆中的地址与在栈中的地址是一样的。因此,它指向zhangsan。在使用setString方法之时,将指针指向的地址的值进行修改。
![](media/15200565364442/15200580079155.jpg)
问题5:简述_block/weak修饰符的区别
答:_block在arc和mrc环境下都能用,可以修饰对象,也能修饰基本数据类型
_weak只能在arc环境下使用,只能修饰对象,不能修饰基本数据类型
_block对象可以在block中重新赋值,_weak不行。
问题6:请简单说明在安装cocoapods时,使用pod install命令安装框架后的大致过程
答:
1)分析依赖:该步骤会分析Podfile,查看不同类库之间的依赖情况。如果有多个类库依赖于同一个类库,但是依赖于不同的版本,那么cocoaPods会自动设置一个兼容的版本。
2)下载依赖:根据分析依赖的结果,下载指定版本的类库到本地项目中。
3)生成Pods项目:创建一个Pods项目专门用来编译和管理第三方框架,CocoaPods会将所需的框架,库等内容添加到项目中,并且进行相应的配置。
4)整合Pods项目:将Pods和项目整合到一个工作空间中,并且设置文件链接
问题7:在开发中,如何去优化tableview呢?
答:
行高一定要缓存: 行高方法其实被调用的次数非常多。通过缓存行高,可以减少大量计算自动布局的过程。
不要动态创建子视图:当cell显示的时候,不要再去创建了。所有的自视图都应该预先创建,如果不需要显示可以设置hidden。
所有的子视图都必须制定背景颜色
所有的颜色都不要使用alpha:设置alpha会增加图层的计算,对性能的消耗非常之大。
cell栅格化
栅格化的代码如下:
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if(self){ //栅格化 self.layer.shouldRasterize = YES; // 栅格化必须指定分辨率,否则默认使用 *1 生成图像 self.layer.raterizationScale = [UIScreen mainScreen].scale; } return self; }
异步绘制
self.layer.drawsAsynchronously = YES;
问题8:SDWebimage 在内存方面存在很大的问题,如何解决动态图片内存不释放的问题?
答:SDWebimage 在内存方面存在很大的内存问题,静态的图片也会出现拉伸问题,动态的gif图内存峰值更加的高,内存释放不会及时。
1、利用CADisplayLink开启一个时钟,每次触发只加载一帧图像!而之前的图像立即释放。
2、用加时钟的方式来解决内存过大的问题,会造成额外的开销。可以将动态图片加载换成YYAnimatedImageView。
问题9:逆向分析最常用的有三种方法是什么?
网络分析
通过分析和篡改接口数据,可以有效的破解通过接口数据来控制客户端行为的app,常用的抓包工具有Tcpdump, WireShark, Charles等,windows平台有fidller
静态分析
通过砸壳、反汇编、classdump头文件等技术来分析app行为,通过这种方式可以有效的分析出app实用的一些第三方库,甚至分析出app的架构等内容,常用的工具有dumpdecrypted(砸壳)、hopper disassembler(反汇编)、class_dump(导头文件)
动态分析
动态分析指的是通过分析app的运行时数据,来定位注入点或者获取关键数据,常用的工具有cycript(运行时控制台)、 lldb+debugserver(远程断点调试)、logify(追踪)
问题10:怎样防止反编译?
本地数据加密
对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息
URL编码加密
对程序中出现的URL进行编码加密,防止URL被静态分析
网络传输数据加密
对客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取数据
方法体,方法名高级混淆
对应用程序的方法名和方法体进行混淆,保证源码被逆向后无法解析代码
程序结构混排加密
对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低
借助第三方APP加固,例如:网易云易盾
问题11:在MVC架构中,如何解决controller层的臃肿问题?
答:
将网络请求抽象到单独的类中
将界面的拼装抽象到专门的类中
构造 ViewModel
这样抽象之后,View 只接受 ViewModel,而 Controller 只需要传递 ViewModel 这么一行代码。而另外构造 ViewModel 的过程,我们就可以移动到另外的类中了。
专门构造存储类
大厂面试题(答案略)
1、 RunLoop 的基本概念,它是怎么休眠的?
2、runtime如何通过selector找到对应的IMP地址?
3、YYAsyncLayer如何异步绘制?
4、你是如何组件化解耦的?
5、_objc_msgForward函数是做什么的?直接调用它将会发生什么?
6、用过 TableView 吗,平时怎么解决 TableView 滑动卡顿问题的?
7、KVC机制是如何通过key找到value?
8、app内存你是如何分析的?
9、使用了第三方库, 有看它们是怎么实现的吗?
10、什么是强连通量算法?
11、如何应对APP版本升级,数据结构随之变化?
12、单例会有什么弊端?
13、如何关闭默认的KVO的默认实现,简述KVO的实现原理。
14、说说Swift和Objective-C的联系。
最后
今天给大家的分享就到这吧!有收获,或者喜欢作者的可以关注作者。同时也欢迎大家加入作者的iOS交流群656315826,群里会提供相关面试资料,书籍欢迎大家入驻!大家一起交流成长!!
作者:iOS小迷糊
链接:https://www.jianshu.com/p/6c56e3640323