iOS社招面试题 - 陆续更新

1.请谈谈堆与栈的区别
答:在iOS的内存管理中,oc对象以堆的方式存放,是动态分配空间的,mrc中要手动释放,分配方式类似数据结构中的链表
而非oc对象一般以栈的形式存放,系统自动回收,分配方式类似数据结构中的栈

总结区别
按管理方式来说
对于栈来说,是有系统编译器自动管理,不需要程序猿手动管理
对于堆来说,释放工作由程序员手动惯例,不及时回收容易内存泄漏
按分配方式来说
堆是动态分配和回收内存的,没有静态分配的堆
栈有动态和静态两种分配方式,但都是由系统编译器分配和释放。其中,用alloc函数进行分配。

2.iOS是如何管理内存的
答:目前oc有MRC和ARC两种内存管理方式,分别表示手动和自动。
两种管理方式的原理均是基于引用计数器,区别是管理人是程序员还是编译器。
引用计数器原理:简单而言,每个oc对象都有一个与之对应的整数,即引用计数器。被创建的oc对象一开始计数器为1,当调用该对象的alloc、retain、new、copy方法,其计数器在原值上+1;当调用该对象的release方法,其计数器在原值上-1。若该对象计数器值为0,会被系统自动调用dealloc销毁。

3.请问深拷贝和浅拷贝有什么区别?
答:简单来说,浅拷贝是增加了一个指针指向已存在的对象的内存地址。深拷贝则是增加一个指针并申请分配一个新的内存,并将该新增指针指向这个新内存。

4.请简单介绍下iOS的多线程有哪些
答:目前iOS多线程有NSThread、NSOperation和GCD三种多线程实现方法。
其中,NSThread通过@selector执行对应的方法
NSOperation可以结合NSOperationQueue队列控制线程并发数,通过@selector执行对应的方法
GCD通过block执行对应的代码或方法,比起上两种调用@selector执行对应的方法而言,代码可以更集中

5.请解释一下关键词的区别:assign与weak,__block与__weak
答:assign和weak都是引用计数的修饰词,均表示弱引用的意思,assign用于基本数据类型,weak用于NSObject对象。
__block和__weak都是引用计数的修饰词,__block表示强引用,被引用对象相当于被retain,可以访问并修改局部变量;__week是弱引用,被引用对象不会被retain。在arc中可以用__weak替代block避免循环引用

6.谈谈block使用时的注意点
答:1.使用block前要对判断block指针是否为空来避免崩溃;2、作为属性时,要copy修饰,将栈上的block拷贝到堆上;3.在block使用玩要对block指针赋空置,在mrc下要先release掉防止循环引用;4使用时将self或成员变量加入block之前要先将self变__weak弱引用防止循环引用;5.在多线程环境下要先将self转为strong指针避免在运行中途被self对象折购

7.UITableViewCell上有个UILabel,显示NSTimer实现的秒表时间,手指滚动cell过程中,label是否刷新,为什么?
答:是否刷新取决于timer加入到Run Loop中的Mode是什么。Mode主要是用来指定事件在运行循环中的优先级的,分为
NSDefaultRunLoopMode(KCFRunLoopDefaultMode,默认)
UITrackingRunLoopMode(scrollView滑动时切换到该Mode)
UIInitializationRunLoopMode(Run Loop启动时,会切换到该Mode)
NSRunLoopCommonModes(Mode集合)
在编程中如果我们把一个NSTimer对象以NSDefaultRunLoopMode(KCFRunLoopDefaultMode)添加到主运行循环中,ScrollView滚动过程中会因为Mode的切换,而导致NSTimer将不再被调度。当我们滚动的时候,也希望不调度,那就应该使用默认模式。但是,如果我们希望ScrollView在滚动时,计时器也要回调,那就应该使用NSRunLoopCommonModes(KCFRunLoopCommonModes)。

8.请简要描述一下UIScrollView的执行过程。它是如何响应手势识别(Gesture Recognizer)、多点触控(MultiTouche)和Run Loop的?
答:当手指接触UIScrollView控件时,UIScrollView会拦截触摸事件,用一个计时器计时手指触摸事件,有效时间内手指没有离开原触摸位置则当出发点触控事件;若有效时间内发誓移动则是执行滚动事件;若有效时间内手指没有离开原触摸位置,但之后移动足够远则取消点触控事件改为滚动事件

9.AutoLayout的作用是什么?请概括一下它是如何运行并需要注意的地方。
答:AutoLayout是自动布局的意思,没有AutoLayout之前,控件通过设置起frame属性改变其位置与尺寸。使用AutoLayout后,变成通过
约束条件改变控件的位置与尺寸,有点是解决了不同分辨率和屏幕尺寸下控件的适配问题。
AutoLayout如何运行:通过一系列约束来定位控件,约束内容包括到某个边界、某个控件的距离等
使用AutoLayout需要注意的地方:1、如果对控件在代码中添加约束,要先除去控件的autoresizing防止两者冲突
2、控件的创建和添加应该在updateViewConstraints方法之前,否则会导致界面抖动
3、固定宽高的控件才能作为其他控件的参照物
4、关于scrollview的自动布局,可以通过scrollview外部的控件确定其内部控件的位置,也可以通过在scrollview内部添加一个容器view,这个view设定与scrollview完全贴近,再将这个view大小改为我们需要的大小,然后往view中添加控件

10.什么是设计模式?聊聊你所知道的设计模式。
答:设计模式是为特定场景下的问题制定的解决方案。我目前知道的设计模式有代理模式、观察者模式、MVC模式、单例模式、策略模式和工厂模式。

11.你会如何存储用户的一些敏感信息,如登录的token
答:使用iOS的keychain来存储,keychain里保存的信息不回因app被删除而丢失,相比NSUserDefaults也更为安全

12.简单说几个你用过的开源组件,并说说它们的使用场景的实现。
AFNetworking:用于网络请求的,默认异步
SDWebImage:下载网络图片,带队列的异步下载
MBProgressHud:加载中的动画
AsynSocket(GCDAsynSocket):socket通讯
FMDB:数据库管理
EGOTableViewPullRefresh/MJRefresh:下拉刷新
ZipArchive:压缩和解压缩文件
FXBlurView:视图模糊工具
SBJson:json串的解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值