从2016年8月份学习完ios课程,十分自信的我以为找工作很好找 。事实上,从15年下半年ios开发已经走下坡路。凭借着对开发的热情我找工作找到了2017年3月,还是没有入职,现实让我不得不做出选择,看来我的转行了。
以下是我面试的面试题总结:
一、ios中assign,copy,retain之间的区别以及weak和strong的区别?
答:assign:简单赋值,不更改索引计数(Reference Counting)。
copy:建立一个索引计数为1的对象,然后释放旧对象。
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1。
weak和strong区别:它们两个不同的是,当一个对象不再有strong类型的指针指向它的时候,它会被释放,即使还有weak型指针指向它。
二、程序启动的完整过程
答:1.main函数
2.UIApplicationMain
* 创建UIApplication对象
* 创建UIApplication的delegate对象
3.delegate对象开始处理(监听)系统事件(没有storyboard)
* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
* 在application:didFinishLaunchingWithOptions:中创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
* 创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
三、内存分区:
答:内存分区:可以分为5个区。说到内存分区,内存即指的是RAM。
《1》栈区(stack): 这个一般由编译器操作,或者说是系统管理,会存一些局部变量,函数跳转跳转时现场保护(寄存器值保存于恢复),这些系统都会帮我们自动实现,无需我们干预。 所以大量的局部变量,深递归,函数循环调用都可能耗尽栈内存而造成程序崩溃 。
堆区(heap): 一般由程序员管理,比如alloc申请内存,free释放内存。我们创建的对象也都放在这里。
全局区(静态区 static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。注意:在嵌入式系统中全局区又可分为未初始化全局区:.bss段和初始化全局区:data段。举例:int a;未初始化的。int a = 10;已初始化的。
常量区:常量字符串就是放在这里的,还有const常量。
代码区:存放代码,app程序会拷贝到这里。
四、客户端的缓存机制?
答:缓存可以分为:内存数据缓存,数据库缓存,文件缓存
《1》每次想获取数据的时候
《2》先检测内存中有无缓存
《3》再检测本地有无缓存(数据库/文件)
《4》最终发送网络请求
《5》将服务器返回的网络数据进行缓存(没存、数据库、文件),以便下次读取
五、ios常用的存储方式?
《1》NSUserDefaults类
《2》Plist文件
《3》解归档
《4》手动存放沙盒
《5》CoreData
《6》第三方数据存储框架
六:多线程
答:GCD是(Grand Central Dispatch)的缩写 ,从系统级别提供的一个易用地多线程类库,具有运行时的特点,能充分利用多核心硬件。GCD的API接口为C语言的函数,函数参数中多数有Block,关于Block的使用参看这里,为我们提供强大的“接口”,对于GCD的使用参见本文
NSOperation与Queue
NSOperation是一个抽象类,它封装了线程的细节实现,我们可以通过子类化该对象,加上NSQueue来同面向对象的思维,管理多线程程序。具体可参看这里:一个基于NSOperation的多线程网络访问的项目。
NSThread
NSThread是一个控制线程执行的对象,它不如NSOperation抽象,通过它我们可以方便的得到一个线程,并控制它。但NSThread的线程之间的并发控制,是需要我们自己来控制的,可以通过NSCondition实现。
七、界面的生命周期?
答:initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)
loadView:加载view
viewDidLoad:view加载完毕
viewWillAppear:控制器的view将要显示
viewWillLayoutSubviews:控制器的view将要布局子控件
viewDidLayoutSubviews:控制器的view布局子控件完成
这期间系统可能会多次调用viewWillLayoutSubviews 、 viewDidLayoutSubviews 俩个方法
viewDidAppear:控制器的view完全显示
viewWillDisappear:控制器的view即将消失的时候
这期间系统也会调用viewWillLayoutSubviews 、viewDidLayoutSubviews 两个方法
viewDidDisappear:控制器的view完全消失的时候
八、SVN管理代码?
答://创建svn服务器
1.svnadmin create /Users//ws/Desktop/svn/mycode
//启动svn服务器
2.svnserve -d -r /Users//ws/Desktop/svn
//初始化服务器
3.svn import /Users//ws/Desktop/ws123 svn://127.0.0.1/mycode/ws123 --username=ws --password=910831 -m "初始化数据"
//从服务器上把代码拿下来
4.svn checkout svn://127.0.0.1/mycode/ws123 --username=ws --password=910831 /Users//ws/Desktop/work
//提交代码(在工作文件夹中)
5.svn commit -m " "
//更新最新版本
6.svn update
九、程序员应聘必备词汇:了解=听过名字;熟悉=知道是啥;熟练=用过;精通=做过东西。
十、就是一些实际遇到的问题(支付,JS交互,蓝牙还有WiFi,推送)。这个的自己去查查