金九银十已经过去,但是也不能阻挡程序猿们跳槽,寻找一份自己满意的工作。 本人收到一位程序员前两天面试中碰到的笔试问题,整理出一份自己的见解跟答案,具体内容如下:

持续关注:菇哒微课,持续输出各大公司iOS面试系列文章,欢迎广大程序猿找我投稿面试中碰到的面试题,我会给你一份我的见解和答案,我前面已经分享100道我招聘的面试题

现场照片

第一题:请举例至少三条以上会造成UITableView卡顿的情况

1、上方这个注释我们可以翻译为。只加载缓冲好的图片,新的下载直到scrolling end,就是上拉下拉结束以后才去进行下载图片然后刷新 2、 使用不透明视图。 3、 重复创建不必要的table cell。 4、 视图的数目过多 5、 多余的绘制工作。 6、 没有预渲染图像。 7、 阻塞主线程。 tableView卡顿解决方案: 1.最常用的就是cell的重用,注册重用标识符(每当需要显示cell的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell) 2.减少cell中控件的数量(view是很大的对象,创建它会消耗较多资源,并且也影响渲染的性能。所以不用的不要加上去,不适用的可以先隐藏) 3.少使用addView 给cell动态添加view. 4.使用不透明视图(半透明情况下app需要消耗性能去渲染,不透明的视图可以极大地提高渲染的速度)。 5.使用局部更新(如果只是更新某组的话,使用reloadSection进行局部更新) 6.加载网络数据,下载图片,使用异步加载,并缓存. 7.不要实现无用的代理方法,tableView只遵守两个协议. 8.使用正确的数据结构来存储数据。 9.当处理一些全屏大图一类的耗资源的操作,可以用预渲染图像,在bitmap context里先将其画一遍,导出成UIImage对象,然后再绘制到屏幕。

第二题:ID类型的delegate属性到底是用assign还是weak,请简述原因

@property (nonatomic, assign, readwrite) id delegate; 声明一个delegate,那么即便delegate指向的对象销毁了,delegate中依然会保存之前对象的地址 即,delegate成为了一个野指针... 而使用weak,则不会有上述问题,当delegate指向的对象销毁后,delegate = nil, 所以答案就是,使用weak。

第三题:为什么IBOutlet修饰的UIView也适用weak关键词

因为当我们将控件拖到Storyboard上,相当于新创建了一个对象,而这个对象是加到视图控制器的view上,view有一个subViews属性,这个属性是一个数组,里面是这个view的所有子view,而我们加的控件就位于这个数组中,那么说明,实际上我们的控件对象是属于view的,也就是说view对加到它上面的控件是强引用。当我们使用Outlet属性的时候,我们是在viewController里面使用,而这个Outlet属性是有view来进行强引用的,我们在viewController里面仅仅是对其使用,并没有必要拥有它,所以是weak的。 如果将weak改为strong,也是没有问题的,并不会造成强引用循环。当viewController的指针指向其他对象或者为nil,这个viewController销毁,那么对控件就少了一个强引用指针。然后它的view也随之销毁,那么subViews也不存在了,那么控件就又少了一个强引用指针,如果没有其他强引用,那么这个控件也会随之销毁。 不过,既然没有必将Outlet属性设置为strong,那么用weak就好了

第四题:题目:iOS一般有几种缓存方式,请一一举例

iOS本地缓存数据方式有六种: 1.直接写文件方式:可以存储的对象有NSString、NSArray、NSDictionary、NSData、NSNumber,数据全部存放在一个属性列表文件(*.plist文件)中。 2.NSUserDefaults(偏好设置),用来存储应用设置信息,文件放在perference目录下。 3.归档操作(NSkeyedArchiver),不同于前面两种,它可以把自定义对象存放在文件中。 4.coreData:coreData是苹果官方iOS5之后推出的综合型数据库,其使用了ORM(Object Relational Mapping)对象关系映射技术,将对象转换成数据,存储在本地数据库中。coreData为了提高效率,甚至将数据存储在不同的数据库中,且在使用的时候将本地数据放到内存中使得访问速度更快。我们可以选择coreData的数据存储方式,包括sqlite、xml等格式。但也正是coreData是完全面向对象的,其在执行效率上比不上原生的数据库。除此之外,coreData拥有数据验证、undo等其他功能,在功能上是几种持久化方案最多的。 5.FMDB:FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码,对比苹果自带的Core Data框架,更加轻量级和灵活,提供了多线程安全的数据库操作方法,有效地防止数据混乱。 6.Realm:跨平台的,底层实现核心是C++写的, FMDB是基于SQLite的封装. 所以他们的实现原理就不一样. Realm直接可以保存模型对象.

第五题:题目:请任意一个面向对象的语言简要实现一个抽象工厂模式

以下实现用的java来实现的抽象工厂

第六题:

题目:假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,及上述字符串处理之后的输出结果为:aabcd