IOS电话技术面试题目(一)

          2015年1月15日下午,正好我们公司在举行年会,于是我把手机静音了,当我拿出手机准备拍照的时候,突然电话响了,显示一个福建厦门的电话,我猜到应该是招聘的电话,也是偷偷跑出去接了电话,果然是的。“同步推”的HR打来的电话,跟我约好2015年2月27日下午两点进行电话技术面试。于是我马上去跑去查这个公司的信息和待遇,感觉公司的前景和待遇相当的不错。

 

          2015年2月29日,下午两点电话准时响起,起先电话声音很小,听不清很尴尬,首先做了个简单的自我介绍。然后马上单刀直入,就开始技术面试了。之前,我都没怎么准备,整个过程问的很详细,特别喜欢刨根问底。整个电话面试有大概半个小时,都是问的基础,基本上没问根项目有关的问题。其实,很多东西我还是懂的,只是没有去总结,导致一时也说不清,所以整个过程感觉回答的挺吃力的。

        问了我十几个问题?最后他终于问完了。问我有没有问题问他的,我本来没有准备问题,但是他问了我这么多问题,让我答得好辛苦,我觉得不能便宜他了,要好好“回报他”。我问他:你们招人是看着他现有的技术还是更注重他个人潜在的学习能力。他说,不论你做那门开发,技术都是很快可以学会的,他们更看重基础,只要基础打好了,技术学起来很快的。

           在大学的课堂上,这句话老师天天说,但是从来就没听进过去,但是这一刻我深深的理解并接受了这句话深刻的含义,可能老师只是没有在正确的时候说这句话。

    

        从我面试的经验来看,一些小公司基本上比较看重的是你现在的技术,只要你能搞定这个事情,你就给我上,不然就OUT你。大公司的话,就喜欢刨根问底,问你的基础和理论。还有为什么大公司喜欢招重点大学和高学历的人,其实也是有原因的,因为他们的基础更扎实,才能创造更大的价值。

       以下是总结的一些面试题,可能有些不太完整和详细,欢迎指教。 Thanks very much !

 

 

一、ARC与非ARC


      1、非ARC的工作原理:

         (1)如果需要持有一个对象,那么对其发送retain, 自动引用计数就会自动+1;

         (2)如果之后不再使用该对象,那么需要对其发送 release(或者autorealse),自动引用计数就会自动-1;

         (3)每次对retain, alloc 或者new 的调用,需要对应一次的release或者autorealse调用。

         (4)其中retain和release都很直接,就是将对象的引用计数加一或者减一。但是autorelease就比较特殊一些,它会将接受该消息的对象放到一个预先建立的自动释放池 (auto release pool)中,并在自动释放池收到drain消息时将这些对象的引用计数减一,然后将它们从池子中移除(这一过程形象地称为“抽干池子”)。


      2、ARC的工作原理:

         在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelease三个关键字就好, 这是ARC的基本原则。当ARC开启时,编译器将自动在代码合适的地方插入retain, release和autorelease,而作为开发者,完全不需要担心编译器会做错。


二、在多线程中使用定时器需要注意什么?

       在多线程中使用定时器会造成线程池的问题,会导致定时器失效,解决方案是将定时器放到NSRunLoop中。

 

三、沙盒机制:     

       IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。

      1、每个应用程序都有自己的存储空间
      2、应用程序不能翻过自己的围墙去访问别的存储空间的内容
      3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。

 

四、Block的用法

       Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值。Block实体形式如下:

       ^(传入参数列){行为主体};

       Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。

 

五、UIViewController的生命周期 

       当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
       1、 alloc                                   创建对象,分配空间
       2、init (initWithNibName)        初始化对象,初始化数据
       3、loadView                            从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
       4、viewDidLoad                      载入完成,可以进行自定义数据以及动态创建其他控件
       5、viewWillAppear                  视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
       6、viewDidAppear                  视图已在屏幕上渲染完成


      当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
      1、viewWillDisappear             视图将被从屏幕上移除之前执行
      2、viewDidDisappear             视图已经被从屏幕上移除,用户看不到这个视图了
      3、dealloc                               视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放

 

六、IOS中堆与栈的区别

1、管理方式:

       对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来讲,释放工作有程序员控制,容易产生memory Leak。

2、申请大小:

       栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶上的地址和栈的最大容量是系统预先规定好的,在Windows下,栈的大小是2M(也有的说1M,总之是编译器确定的一个常数),如果申请的空间超过了栈的剩余空间时候,就overflow。因此,能获得栈的空间较小。

       堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大笑受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

3、碎片问题:

       对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存快从栈中弹出。

 4、分配方式:

       堆都是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,他的动态分配由编译器进行释放,无需我们手工实现。

5、分配效率:

       栈是机器系统提供的数据结构,计算机会在底层堆栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,他的机制是很复杂的。

 

七、IOS数据本地化的方法:

       1、NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。

        2、NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。

       3、写入沙盒中;

       4、用数据库保存;

 

八、object语言的特点:

        1、 Object-C 的前世今生

               Object-C语言由 Brad J.Cox于20世纪80年代早期设计,以SmallTalk为基础,建立在C语言之上。

         2、 数据类型和表达式     

             (1)继承自C 的结据结构与表达式:

               Object-C是基于C语言的,在C语言上进行扩展的。因此它支持C 下,所有的基本数据结构与运算符,下表总             结了其支持的

               基本数据结构与运算符。

               (2) Object-C新增的数据结构:

                Object-C了一个可以存储任何类型的数据结构 ----  id数据类型。它是一般对象类型,能够存储任何类型的方             法。

          3、流程控制

          Object-C继承了全部C的流程控制,if-else语句, while语句,switch语句,在这里就不细说了。

          4、类与结构

               (1) 简单的类:

               在Object-C中, 一个类分为接口与实现两个部分,分别使用@interface与@implementation来表示。

               @interface用于描述类、类的数据成分以及类的方法;@implementation部分包括实现这些方法的实际代码。

               (2) 两个类中的特殊引用:

               在Object-C中,在类中提供了两个特殊的引用,一个是self, 一个是super 。

               self引用 C语言中的this指针一样,指向该类本身,而super则是指向其父类。

               (3) 类继承与扩展

                a) 类继承

                Object-C中定义的所有类都必须继承自同一个父类-- NSObject,也可以继承自某个已经继承了NSObject的                     类,成为其子   

                类。关于类继承的一些规则与C++语言类似,在这里就不详细描述了。

                b)  类扩展

               Object-C也提供了另外一种在原有类上进行扩展的机制,叫做类扩展。使用这种机制可以在不修改原有类代码                的基础上进行

                类的扩展。经过扩展后的类拥有新的属性或者方法

               (4) 动态特性

                      Object-C中一个强大的特性就是它的动态因素。每个对象都保存着它所拥有的一些类属性,包括属于哪个                类, 哪个父类, 是否响应某个函数等等,因此 Object-C也支持一些处理动态类型的方法。

               也因为Object-C 的动态特性,导致了一些常规的编译时性能优化方法都不用能于Object-C,这也是导致          

               了 Object-C的运行性能劣于类似的对象抽象语言(如C++) ,因此一些底层的操作应使用C++或类似的语言进                行封装,由Object-C负责高层逻辑的封装。

              (5) 多重继承的偏方

                     由于Object-C不支持多重继承,有一些逻辑类的封装可能无法方便地使用,因此Object-C中提供了协议的                  机制,一个类可以实现若干的协议,从这个角度实现了类的多重继承。 

          5、 基本的 C 语言特性

          a) import 与 include
              对于Objecy-C与C语言两大阵营的一个分歧在于,Object-C更偏向于使用import并且性能比include更高。 

          b) define

              Object-C支持所有的预编译操作

          c) 指针

              Object-C支持C中的指针操作

         6、Object-C的一些原理

        (1)类对象的结构

                每个对象的结构中保存着该类的所有成员属性与一个名为isa的保护成员属性,其记录着该对象所属于的类,          当该对象调用函数的时候则通过这个isa的保护成员属性确定其所属的类,从而知道如何调用这个方法。

        (2)类对象的指针属性

               在Object-C中,所有的对象变量都必须以指针的形式定义,并使用alloc函数进行内存分配。而在Foundation             框架中,Object-C提供了自动释放池与自动垃圾回收机制去进行内存管理。在Object-C 中, 类对象更像是一种引           用,采用引用计数进行,自动释放是iphone sdk中一个重要的内容。

        (3)函数调用

        在Object-C中,函数调用都是使用一种消息机制,向特定的类对象发送消息,以达到函数调用的目的。

 

其实,我真的发现我的基础不是太牢固,因为IOS开发差不多是自学的,没有完整理论体系。很多时候就有一种感觉就是我能做出来,但是我讲不出来。所以很有必要重新学习一下基础,子曰:书,应该多读几遍,才能才大神!!!

 

 

 

 

 

 

 

 

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值