首页 > 代码库 > iOS面试题收集

iOS面试题收集

1.请简述NSSet、NSArray 、NSDictionary的区别
  NSSet、NSArray、NSDictionary  都是属于不可变集合类, 在集合类里只能添加对象元素不能添加基本数据类型。
  不可变:在创建完集合类后就不能够对他们进行修改。
  NSSet  :
  1.是一个无序的集合
  2.在内存中存储的地址是不连续的
  3.并且添加进去的元素是不可重复的
  4. NSSet它是使用hash算法方式 直接找到元素的位置。
 NSArray
 1.是一个有序的集合
 2.在内存中存储的地址是连续的,添加的元素是可重复的
 3. NSArray能够支持通过下标访问元素。
 4. 如果想知道一个元素是否存在这个数组当中的话,那么需要遍历整个数组一个个去判断,这样显然效率地下。
 NSDictionary
 1.这一个无序的集合
 2.它的数据存储方式是key value 键值对的方式进行存储的
 3.key 在整个NSDictionary 里是唯一的,如果key发生重复,那么后添加的元素会覆盖之前的。
 4.同NSSet一样也是使用hash 直接找到元素的位置,效率快。
 
 2.请简述static关键字有什么作用
  当使用static修饰变量的时候,称这个变量为静态变量,所谓的静态变量也就其在内存当中只有一份, 当程序结束的时候才会销毁这块内存。 
  static 只能在implement外或者是方法中声明,如果不给它 赋予初值 默认值为0  ,程序启动后会给它进行一次初始化操作。
  被static修饰过的变量 不能通过类名.的方式进行访问, 如果想访问一个类里的static变量并对它进行一些修改, 需要提供一个方法。
  
3.  请说明什么时候用代理,什么时候用通知
 
代理 :是一对一的关系 , 1个对象只能告诉另外一个对象发生了什么事。
通知 : 多对多的关系,1个对象能够告诉多个对象发生了什么事,1个对象能够接收多个对象发生了什么。
 
4.  请说明分类与类扩展有什么区别。 
   分类:能够在不熟悉原有类的情况下给这个类添加方法。如果新添加的方法与原有类的方法相同,那么系统会优先使用分类的方法。
  类扩展:类扩展可以在原有类的基础上给这个类添加 属性和方法,其添加的方法必须要实现。
 
5.请说明什么是懒加载,懒加载有什么用?
   懒加载也称为延迟加载。 即用到的时候再加载。 
   懒加载的作用:一般用于页面很长,页面但中图片很多的情况下,如果想把这些数据一次性加载完成,那是不可能的,而且这样性能也不好。 为了避免这种请况发生,目前主流的做法是页面初次加载时,只显示当前可视区域的图片,当用户滚动页面的时候,当图片进入可视区域时再加载,这样可以明显的提高页面加载速度,而更少的图片并发请求数,也可以大大的减轻服务器的压力,可谓一举多得。
 
   图片延迟加载的原理比较简单,先把图片的真实地址写在自定义的一个属性上,比如 data-url(HTML5中以 data- 开头的自定义属性都是合法的),src 地址最好不要空着,放一个 1×1 的全透明占位图片就行了,如
     当页面滚动的时候开始计算图片是否处在当前窗口的可视区域,如果在的话,就把 src 的假地址替换成 data-url 的真实地址。
 
 
6.请说明 #include 、#import @class 各自的作用
  #include :  是C语言的预编译指令 告诉编译器导入相关的头文件  ,在OC 当中也能使用 因为OC 兼容C语法
  #import : 是GCC编译器提供 不管在一个文件中出现多少次,可保证头文件只被包含一次
  @class : 告诉编译器当前这个文件中 声明了这个类,但是类里面具体定义什么不知道,使用它能减少编译时间
 
7.#import <> 与#import “” 有什么区别
  #import <> 导入系统的头文件
  #import " "  导入用户自定义文件
   
8.id类型是什么,instancetype是什么,有什么区别
   id类型:万能指针,能作为参数,方法的返回类型。
    instancetype:  只能作为方法的范围类型,并且返回的类型是当前定义类的类类型。
 
9.请写出ARC与MRC中英文全称
   ARC : Automatic  Reference Counting   自定引用计数
   MRC :   Mannul     Reference Counting   手动引用计数
 
10.请说明什么是block,block能用来干什么,__block有什么用。
 
   Block对象是 C 级别的语法和运行时特性 它们和标准 C 函数很类似,但是除了可执行代码外,它们还可能包含了变量自动绑定(栈)或内存托管(堆)。所以一个block维护一个状态集(数据),它们可以在执行的时候用来影响程序行为。 
 你可以用blocks来编写函数表达式,这些表达式可以作为 API 使用,或可选的存储,或被多个线程使用。Blocks作为回调特别有用,因为block携带了进行回调所需要的执行代码和执行过程中需要的数据。 
  
__block作用:默认block 块内出变量是不能进行修改 _也就是只读的状态,使用__block修饰变量就能够改变block块内中的变量的值。
 
11.什么是面向对象,面向对象的特性是什么?
 把现实世界当中的所有事物关系都抽象成在计算机里可表示的一个关系。那么这个具体的事物就是这个对象。
面向对象的特性: 继承 封装 多态
 
12.什么是多态?
同一个操作,作用于不同的对象,产生不同的结果。
实现多态要具备以下条件
1.要有继承
2.要有重写
3.父类的指针指向了子类的对象。
 
13. 请简述什么是MVC
MVC : Model View Controller (模型、视图、控制器)
Model :负责处理数据逻辑,模型对象负责在数据库当中存储。
View : 负责显示数据,显示的数据是依据模型来进行显示
Controller:负责处理用户交互,负责从视图读取数据,控制用户输入,并向模型发送数据。
特点:
 降低模块之间的耦合度
 
MVC不属于设计模式,它是一种架构、体系结构的设计。
架构设计:一个架构模式描述软件系统里的基本结构和组织纲要。架构模式提供一些事先定义好的子系统,指定它们的责任,并给出把它们组织在一起的法则和指南。有人将架构模式称为系统模式。一个架构模式通常可以分解成很多个设计模式的联合使用。
 
设计模式:一个设计模式提供一种提炼子系统或软件系统中的组件或者它们之间关系的设计。设计模式描述普遍存在的在相互通信的组件中重复出现的结构,这种结构解决在一定的背景中的具有一般性的设计问题。
 
14.请写出你所知道的数据传递方式
1.代理
2.通知
3.直接访问对象的set方法进行数据传递
4.block
 
15.点语法的本质是什么?写一个点语法的例子。
点语法的本质是调用了getter setter 方法。
例: person.age = 10;// 这里调用了 [person setAge:10]
int age = person.age; // 这里调用 [person age];
 
16.@property 作用
 
@property  让编译器自动生成与类成员变量相同名的   getter  setter  方法  创建的成员变量是以_开头 它创建的默认修饰域是private
还能进行对 对象内存管理 
 
17.@property
 当中的retain 与assign有什么作用
retain: 只能给对象类型使用,当调用set方法的时候会将对象的引用计数器+1
assign: 直接赋值,一般给基本数据类型使用, 不会增加引用计数 , 设置代理的时候需要使用assign ,assign主要是为了解决循环引用计数而设计的。
 
18.什么是构造方法,构造方法有什么用,使用构造方法有什么注意点。
什么是构造方法:构造方法是对象初始化并返回对象一个实例的一个方法。
构造方法有什么用: 一般在构造方法里 对类进行一些初始化操作
注意点:方法开头必须以init开头,接下来名称要大写 例如 initWithName ,initLayout
 
 
19.请简述什么是协议,协议能用来做什么
 协议:一个公共的接口。
在协议里只能定义方法不能定义属性,协议的实现需要具体的类去遵循这个协议实现协议里的方法。在协议里定义的方法可以是可选实现和必须实现的,默认是可选的。
 
20.内存管理的原则是什么。
只要出现new,alloc,copy,mutableCopy,copyWithZone,retain,就要配对release操作,或者autorelease操作
 
21.请说明frame和bounds的区别
frame : 以父控件左上角为原点,显示当前控件所在的位置和尺寸大小
bounds :以控件本身左上角为原点,显示当前的尺寸 bounds改变会改变控件的frame
 
22.请说明xib和storyboard对比有什么区别
都是用来描述软件界面
    xib是轻量级,用来描述局部UI界面
    StroyBoard是重量级,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系
 
23.一般重写loadView是用来干什么
用来进行自定义控制器的视图
 
24.请写出视图控制器的生命周期方法
loadView
viewDidLoad
viewWillAppear
  viewDisAppear
viewWillDisAppear
viewDidDisAppear
didReceiveMemoryWaring
viewWillUnLoad
viewDidUnLoad
 
25.请写出以下默认尺寸大小
     iPhone3.5英寸 非 retina  320 * 480
     iPhone3.5  retina     640 * 960
     iPhone 4英寸      320 * 568
     UIStatusBar         320 * 20
     UINavigationBar  320 * 44  
     UITableViewCell   320 * 44  
     UITabBar    320 * 49
 
26.UIImage加载图片通过
 + (UIImage *)imageNamed:(NSString*)name;
 + (UIImage *)imageWithContentsOfFile:(NSString *)path
 这两个方法加载图片有什么不同。
 
1.上面这种方式加载图片只需要传入图片的名字不需要传入具体的路径  加载完后会有缓存。
2.下面加载图片需要传入图片的全路径 直接加载    
 一般使用小图片的时候可以选择使用上面的方式,大图片使用下面的方式。
 
27.drawRect:?法在什么时候被调用?
     当视图第一次被显示到window上的时候会调用此方法
     手动调用setNeedsDisplay 或者 setNeedsDisplayInRect
28.请说明UIView与CALayer的关系?
     UIView能够接收事件的处理和视图的展示  而CALayer只是视图的绘制 ,因此一个视图他不需要与用户进行交互应使用CALayer性能会高一些, 这样更加轻量级。
29.如何利用Quartz2D 绘制东西到视图上
     1.获取图形上下文
     2.绘制路径
     3.保存路径
     4.渲染到具体的视图上。
30.一个UIViewController是否可以关联两个不同数据源来显示两个tableView?
     可以。
第一种方式
    1.配置数据源的时候,要对配置的tableView做类型判断

 1 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 2 { 3         if(tableView ==self.tableView1) 4         { 5         return 5;    6         }  7         else 8         {   9        return 10;    10         } 11 }12 13 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {   14  staticNSString *ID1 =@“cellStyleOne";   15  staticNSString *ID2 =@"cellStyleTwo";16         UITableViewCell *cell =nil;  17   if(tableView ==self.table1) 18   {    19      cell = [tableView dequeueReusableCellWithIdentifier:ID1];     20            if(cell ==nil)21            {           22           cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle          reuseIdentifier:ID1];      23            }              24          [cell.textLabel setText:@"itcast"];  25          [cell.detailTextLabel setText:@"detail"]; 26   } 27   else28   {        29      cell = [tableView dequeueReusableCellWithIdentifier:ID2];       30  if(cell ==nil) 31     {           32      cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault      reuseIdentifier:ID2];  33      }               34     [cell.textLabel setText:@“kolnick"];  35   }  36   return cell; 37 }

 


 
第二种方式:
 新建的一个视图控制器 让其遵循数据源协议,并实现相关方法
 然后在第一个视图控制器里创建并把他的视图加入到第一个视图控制器当中。
 
 
31.UIImageView可以直接点击响应操作?如果不可以,怎么才可以?如何监听UIImageView的触摸事件? 
不可以
打开userInteractionEnable =YES;
因为UIImageView也是继承自UIView 凡是继承自UIView都可以接收用户的触摸事件
方法1.重写touchesBegin方法
方法2.给其添加手势

iOS面试题收集