IOS面试题 ios笔试题 带答案

来源:互联网 发布:淘宝不退款怎么办 编辑:程序博客网 时间:2024/04/29 13:47

自己整理的一份ios初级中级面试题

一.

1、下面那个方法不属于NSObject的内省(Introspection)方法 
A. init 
B. isKindOfClass 
C. responseToSelector 
D. isMemberOfClass


2、需要在手动管理内存分配和释放的Xcode项目中引入和编译用ARC风格编写的文件,需要在文件的Compiler Flags上添加参数: 
A. -shared 
B. -fno-objc-arc 
C. -fobjc-arc 
D. -dynamic


3、下面关于Objective-C内存管理的描述错误的是 
A. 当使用ARC来管理内存时,代码中不可以出现autorelease 
B. autoreleasepool 在 drain 的时候会释放在其中分配的对象 
C. 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露 
D. 在使用ARC的项目中不能使用NSZone


4、下面关于#import和#include的描述正确的是 A. #import 是 #include 的替代指令,防止重复引用 
B. #import 和 #include 不可以混合使用 
C. #import 只用于引用 Objective-C的文件, #include 只用于引用C和C++的文件 
D. #import 和 #include 的使用效果完全相同


5、在UIKit中,frame与bounds的区别是 
A. frame 是 bounds 的别名 
B. frame 是 bounds 的继承类 
C. frame 的参考系是父视图坐标,bounds 的参考系是自身的坐标 
D. frame 的参考系是自身坐标,bounds 的参考系是父视图的坐标


6、下面关于线程管理错误的是 
A. GCD所用的开销要比NSThread大 
B. 可以在子线程中修改UI元素 
C. NSOperationQueue是比NSthread更高层的封装 
D. GCD可以根据不同优先级分配线程


7、下面代码的作用是让doSomeThing函数每隔1秒被调用1次。请问哪里有问题

NSTimer *myTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(doSomeThing:)  userInfo:nil repeats:YES]; [myTimer fire]

A. 没有将timer加入runloop 
B. doSomeThing缺少参数 
C. 忘记传递数据给userInfo 
D. myTimer对象未通过[[myTimer alloc] init]方法初始化


8、一个类的delegate(代理)的作用不正确的是 
A. delegate中的函数在其他类中实现 
B. 主要用于不同类型的对象之间一对一传递消息 
C. 没有指派则不会触发 
D. 可以一个对象的delegate指派给多个其他类型的对象


9.以下属于iOS 开发中数据持久性的是 (多选)

A.文件写入(plist) B.对象归档 C. sqlite数据库 D.coredata 


10 Prefix.pch的用处 (多选)

A.存放一些全局的宏

B.项目的配置属性

C.用来包含一些全部的头文件

D.能自动打开或者关闭日志输出功能

 

1.A 2.C 3.A 4.A 5.C 6.B 7.A 8.D 9.ABCD 10.ACD

 

二.

1.#import和#include的区别 @class?

答:@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文 件中还是需要使用#import

而#import比起#include的好处就是不会引起交叉编译


2.在一个对象的方法里面:self.name= “object”;和 name =”object” 有什么不同吗?

答:

self.name =”object”:会调用对象的setName()方法;

name = “object”:会直接把object赋值给当前对象的name属性。


3.#include<filename>和#include”filename”有什么区别

答:#include<filename>直接在库文件目录中搜索所包含的文件;#include”filename”在当前目录下搜索所包含的文件,如果没有的话再到库文件目录搜索。

 

4.pushViewController和presentViewController有什么区别?

两者都是在多个试图控制器间跳转的函数

presentViewController提供的是一个模态视图控制器

pushViewController提供一个栈控制器数组,push/pop


5. 方法和选择器有何不同?
  答案:selector是一个方法的名字,method是一个组合体,包含了名字和实现.


6.介绍NSURLConnection类及+sendSynchronousRequest:returningResponse:error:与–initWithRequest:delegate:两个方法的区别?
  答案:NSURLConnection主要用于网络访问,其中+ sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。

 

三.

1.如何制作一个静态库/动态库?他们的区别是什么?

Xcode6支持制作静态库/动态库 framework

无论是动态库还是静态库都是区分真机和模拟器的,需要lipo命令进行合并

静态库编译静态库文件装入程序空间,动态库是文件动态装入内存

动态库执行到相关函数才会被调用,节省空间


2.什么是ARCARC的基本规则以及优缺点

ARC全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码。有一点,ARC并不是GC,它只是一种代码静态分析(Static Analyzer)工具。

   ARC的基本规则

1retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用

2dealloc虽然可以被重载,但是不能调用[super dealloc]

ARC好处

1 使Objective-C的代码变得简单,不需要担心内存管理以及内存泄露

2 代码的总量变少了,看上去清爽了不少,也节省了劳动力

3代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性

 ARC的缺点

1记住一堆新的ARC规则 — 关键字及特性等需要一定的学习周期

2一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关


3.Objective-C内存管理有哪几种,请简单介绍,内存管理的基本原则是什么。
  Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
  1. (Garbage Collection)自动内存计数:这种方式和java类似,在你的程序的执行过程中。系统会准确地帮你收拾垃圾,你不用考虑它什么时候开始工作,怎样工作。你只需要明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉,反正系统会帮我收拾垃圾。但是它需要消耗一定的资源,在携带设备里面,不支持这个功能。
  解决: 通过alloc – initial方式创建的, 创建后引用计数+1, 此后每retain一次引用计数+1, 那么在程序中做相应次数的release就好了.
  2. (Reference Counted)手动内存计数:就是说,从一段内存被申请之后,就存在一个变量用于保存这段内存被使用的次数,我们暂时把它称为计数器,当计数器变为0的时候,那么就是释放这段内存的时候。
  3. (NSAutoRealeasePool)内存池:可以通过创建和释放内存池控制内存申请和回收的时机.

内存管理原则:

(1)如果使用 alloc、copy(mutableCopy)或者 retian 一个对象时,你就 有义务,向它发送一条 release 或者 autorelease 消息。其他方法创建的对象,不 需要由你来管理内存。 

(2)向一个对象发送一条 autorelease 消息,这个对象并不会立即销毁, 而是将这个对象放入了自动释放池,待池子释放时,它会向池中每一个对象发送 一条 release 消息,以此来释放对象。 

3)向一个对象发送 release 消息,并不意味着这个对象被销毁了,而是 当这个对象的引用计数为 0 时,系统才会调用 dealloc 方法,释放该对象和对象 本身它所拥有的实例。 

 

4.请简述苹果账号的种类以及功能,并写出它们的发布项目的流程。


5.多线程问题

多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始的多线程方法存在很多的毛病,包括线程锁死等。在Cocoa中,Apple提供了NSOperation这个类,提供了一个优秀的多线程编程方法。

本次介绍NSOperation的子集,简易方法的NSInvocationOperation

一个NSOperationQueue 操作队列,就相当于一个线程管理器,而非一个线程。因为你可以设置这个线程管理器内可以并行运行的的线程数量等等

6  iOS多线程常见面试题

在项目什么时候选择使用GCD,什么时候选择NSOperation

项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。

项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。


0 0
原创粉丝点击