iOS常见的面试题总结

来源:互联网 发布:火车头登录帝国cms 编辑:程序博客网 时间:2024/04/29 03:32

1.   简述OC中内存管理机制

oc中的内存管理机制是自动引用计数,它分为两种方式:MRC和ARC,MRC是手动管理内存,ARC是系统自动管理内存;他的原则是谁开辟谁释放,有开辟就要有销毁

2.   readwrite,readonly,assign,retain,copy,nonatomic 、atomic、strong、weak属性的作用?

Readwrite:读写特性,可读可写(是默认属性)

Readonly:只读,只有getter没有setter

Assign:修饰一些基本的数据类型(int  char  float double)和id类型

Retain:修饰一些计数类型

Copy:一般修饰字符串类型

Nonatomic:非原子性,不需要考虑线程的安全,执行效率高

Atomic:原子性的,优点就是线程是安全的,但是执行的效率低

3.    关于iOS 多线程问题

多线程有三种方式:NSThread、NSOperationQueue、GCD

NSThread:是比较轻量级的线程,需要自己管理线程内地生命周期,线程的同步

NSOperationQueue:是一个操作队列,用来管理Operation对象的执行,会根据需要自动开辟合适数量的线程去执行任务

GCD:是比较常用的一种线程,可以分为三种:主线程队列,并行队列和串行队列

4.提升UITableView性能的几点建议

a.使用懒加载,什么时候使用,什么时候初始化并开辟内存空间,减少内存的占用

b.自定义cell的高度

c.cell的重用机制,给cell添加重用标识符

5.线程同步和异步的区别?

同步:一个线程要等待上一个线程执行完后才能执行当前的线程

异步:就是可以同时执行多个线程

6.堆和栈的区别?

栈区:是由编译器自动分配释放的,主要存放一些函数的参数值,局部变量的值,顺序是先进后出

堆区:是由程序员分配释放,顺序是先进先出

全局区(静态区):初始化的全局变量和静态变量放在一个区域,未初始化的放在相邻的区域,程序运行结束后,有系统进行释放

文字常量区:存放常量字符串,程序结束后有系统释放

程序代码区:存放函数体的二进制文件

7.iOS类是否可以实现多继承?

不可以实现多继承,可以通过delegate和protocol和类别来实现类似多继承

8.iOS本地数据存储都有哪几种方式?iOS如何实现复杂对象的存储?

文件写入,对象归档,SQLite,coreData,NSUserdefault

文件写入:永久的保存在磁盘中,只支持NSString,NSData,NSArray,NSDictionary

对象归档:就是给对象数据进行加密,确保数据的安全性,自定义的对象归档必须遵循NDCoding协议

SQLite:数据库需要注意的是FMDB不是数据库,而只是数据库的管理框架

9.iOS的动态性

动态类型:一般使用的都是id类型,也就是当程序运行时,才能判断具体的类型

动态绑定:就是当程序运行时,根据需要调用相应的方法

动态载入:程序运行时,根据需求加载相对应的模块

10.深拷贝和浅拷贝的理解?

深拷贝,拷贝的是内容,浅拷贝拷贝的指针;两者的区别就是查看对象的地址是否有改变,如果有改变就是深拷贝

11.什么是安全释放

在对象dealloc中release之后再将指针置为nil

12.怎样实现一个singleton。

+ (ZMYSingleton *) sharedInstance{

    static LOSingleton *sharedInstance = nil ;

   static dispatch_once_t onceToken;  // 锁

  dispatch_once (& onceToken, ^ {

      // 最多调用一次       

   sharedInstance = [[ZMYSingleton alloc] init];  

});   

return  sharedInstance;

13.Runloop是什么?

一个runloop是一个事件处理的循环,经常在线程中使用,当开辟一个线程时就会有一个runloop,主线程的runloop默认是开启的,手动开辟的子线程runloop默认是不开启的,如果需要开启就要调用API[[NSRunloop  currentRunloop] run]开启。最常见的需要开启的runloop是在子线程里面调用计时器NSTimer

14.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?

#define kMIN(X,Y) ((X) > (Y)) ? (Y) :(X) 

 

15.简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?

进入后台生命周期走:(将要进入后台,已经进入后台) 

- (void)applicationWillResignActive:(UIApplication*)application;  

- (void)applicationDidEnterBackground:(UIApplication*)application;  

回到前台生命周期走:(将要进入前台,已经进入前台)   

- (void)applicationWillEnterForeground:(UIApplication*)application;  

- (void)applicationDidBecomActive:(UIApplication*)application;

 

16.ViewController的loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分别是在什么时候调 用的?在自定义ViewController的时候这几个函数里面应该做什么工作?

loadView:加载视图时调用

viewDidLoad:试图加载完成后调用

viewWillAppear:试图即将出现的时候调用

viewDidUnload:<iOS6之后废弃>当系统内存不足时会调用该方法,释放掉当前未在window中显示的试图和对应的控制器

17.描述应用程序的启动顺序。

1、程序入口main函数创建UIApplication实例和UIApplication代理实例

2、在UIApplication代理实例中重写启动方法,设置第一ViewController

3、在第一ViewController中添加控件,实现对应的程序界面。

18.为什么写代理的属性都是assign而不是retain?请举例说明。

代理属性使用assign是为了防止循环引用,如self.delegate = self

19.UIImage初始化一张图片有几种方法?简述各自的优缺点。

a.从资源读取,就是图片是从缓存中获取的,首先要先判断缓存中是否有这个图片,没有的话要将图片添加到缓存中在使用,有的话就可以直接使用,但是缺点是执行的效率比较低

b.从手机本地读取,需要获取图片的存储路径,执行效率高,但是用起来比较繁琐

20.这段代码有什么问题吗:

@implementation Person

- (void)setAge:(int)newAge {

        self.age = newAge;

}

@end

死循环

 

21.用OC写一个冒泡排序

 NSMutableArray*array = [NSMutableArray arrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];

    for (int i =0; i < array.count;i ++) {

       for (intj =0; j < array.count -1 - i; j++) {

           if([[arrayobjectAtIndex:j]integerValue] > [[arrayobjectAtIndex:j +1]integerValue]) {

               [arrayexchangeObjectAtIndex:jwithObjectAtIndex:j +1];

           }

       }

   }

    NSLog(@"%@",array); 

22.简述你对UIView、UIWindow和CALayer的理解

UIView继承于UIResponder, UIResponder继承于NSObject,UIView可以响应用户事件,而CALayer做不到这一点;UIView侧重于内容的管理,CALayer侧重于对内容的绘制,对内容进行一些动画处理

(生活中的例子:墙上的照片)

23.frame和bounds区别:

 frame: 该view在父view坐标系统中的位置和大小。(参照点是,父视图的坐标系统)
 bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统)

本地 坐标系统的关键就是要知道的它的原点(0,0)

24.写一个完整的代理 

25.分析json、xml的区别?json、xml解析方式的底层是如何处理的?

xml是一种标签语言,适用于web传输

json是一种比较轻量级的数据交换格式,使用AFNetworking进行json数据解析;优点是兼容性很高,可读性,完全独立于语言文本格式

26.ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?

didReceiveMemoryWarning在出现内存警告的时候执行该方法,默认操作就是释放掉暂时没使用的可重用的对象。

27.面向对象的三大特征,并作简单的介绍

封装:把客观的事物封装成抽象的类,隐藏它的内部实现,只提供接口

继承:可以使用现有类的所有功能

多态:不同的对象使用自己的方法去响应相同的消息

28.简单的说一下懒加载

懒加载就是什么时候使用,什么时候创建,开辟内存,这样可以减少内存的占用

29.分别描述类目(categories)和延展(extensions)是什么?以及两者的区别?继承和类目在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?

类目:就是在不知道源码的情况下为一个类扩展方法

延展:为一个类声明私有方法和变量

类目的作用就是为已知的类添加方法

30. #import、#include和@class有什么区别

#import与#include都是查看类中的方法,#import是确保头文件只能引入一次,不会引起交叉编译

@class对一个类进行声明,告诉编译器有这个类,但是类中的定义什么都不知道,

@class比#import的编译效率高,它俩的主要区别是解决引用死锁的问题

31.谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别的设计模式吗?

MVC是一种设计模式,也就是model-view-controller,model是数据模型,view是现实内容,controller相当于是model与view之间的桥梁,它可以将model中的数据在view上显示出来

使用MVC可以提高代码的重用性,便于代码后期的维护与更新

常用的设计模式是:delegate,单例,target-action设计模式

32.字符串替换方法:

[string stringByReplacingOccurrencesOfString:@"png" withString: @""]

33.对于语句NSString* testObject = [[NSData alloc] init];       testObject 在编译时和运行时分别是什么类型的对象?

编译的时候是NSString类型,运行的时候是NSData类型

34.什么是沙盒(sandbox)?沙盒包含哪些文件,描述每个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径?

沙盒:是指程序的系统文件存储的区域,包含三个文件:Documents,Library和tmp

Documents:存放浏览的文件

Library:存放缓存文件(退出应用不会被删除)

tmp:存放临时文件(退出程序会被删除)

35.    isKindOfClass、isMemberOfClass作用分别是什么?

两者的作用都是检测一个对象是否是一个类的成员,不同的是isKindOfClass还可以检测一个对象是否派生自该类的类的成员

36.TCP:是传输控制层协议,是面向连接的,可靠的,基于字节流的运输层;(遵循三次握手原则:给服务器发送消息时,会原路返回一条消息,告诉对方数据已经接收到,然后再返回一条消息,告诉对方也收到了数据,证明这条线路是安全的)

37.static关键字的作用

静态全局变量

static标记的变量会存储到全局变量区,生命周期与程序相同

只在声明的类中可见,并且在声明的类结束后,再次使用的还是之前的值

优点:

节省内存。静态变量只存储一次,可以被所有对象使用,值可以更新,对象可以直接访问到更新后的值


42.应用层有8层:

Telnet协议、FTP文件传输协议、超文本传输协议(HTTP)、SMTP简单邮件传输协议、时间协议、DNS、SNMP简单网络管理协议、TFTP简单的文件传输协议

43.iOS系统框架分为几层?

iOS系统框架分为4层:触摸层(Cocoa Touch),媒体层(Media),核心服务层(Core Services),核心操作系统层(Core OS)

触摸层:是iOS设备上的触摸交互操作,一般程序框架都是在触摸层

媒体层:在应用中使用媒体文件,进行音频,视频,以及动画效果的实现

核心服务层:可以访问iOS中的一些服务

核心操作层:就是实现一些内存管理,文件管理和电源管理等系统的操作






 





 

 

0 0
原创粉丝点击