iOS开发之OC最常见面试题总结

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

OC的内存管理机制是自动引用技术,内存管理的原则是谁开辟谁释放,分为ARC和MRC,MRC的话就是需要我们程序员手动管理内存,ARC不需要我们手动管理内存,系统会自行管理。

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

readWrite读写特性, 可读可写.

readonly只读, 只有getter, 没有setter.

assign一般用于基本数据类型和ID类型.

copy拷贝, 一般用于 NSString. 分为深拷贝和浅拷贝, 深拷贝拷贝的是对象, 浅拷贝拷贝的是指针. 

nonatomic非原子性, 不考虑线程安全, 优点是效率高.

atomic原子性, 优点是线程安全, 缺点是效率低.

strong强引用, 和MRC下的retain一样. weak弱引用, 类似MRC下的assign. 但是要注意的是strong和weak都是修饰对象类型的属性的, 不能修饰基本数据类型. ARC下仍然使用assign修饰基本数据类型. 

3.关于iOS多线程问题

仔细阅读:http://www.cocoachina.com/ios/20150731/12819.html

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

1.cell高度计算 (可以先根据内容高度数组,返回cell时直接用数组返回高度

2.cells的重用

3.cell快速滑动的时候不加载图片,停止滑动的时候加载图片

4.避免阻塞主线程

5.缓存下载的图片

6.不要过多使用Xib(如果可以的话使用storyboard)

7.使用CoreGraphics

8.透明度

也可仔细阅读:http://www.cocoachina.com/ios/20150729/12795.html

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

同步:一个线程要等待上一个线程执行完之后才能执行,生活中的例子(上厕所)。

异步:同时去做两个或者多个线程。比如边听歌边看报。

7.堆和栈的区别?

栈区(stack)--由编译器自动分配释放,存放函数的参数值、局部变量的值。先进后出

堆区(heap)--一般由程序员分配释放。先进先出

全局区(静态区)(static)--全局变量和静态变量。程序结束后由系统释放。        

文字常量区--常量字符串存放在这里。程序结束后由系统释放。         

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

8. iOS类是否可以多继承?

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

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

1.Write写入方式:永久保存在磁盘中。只支持NSString、NSData、NSArray、NSDictionary。

 2.NSKeyedArchiver(归档)采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议

3.SQLite(FMDB)注意FMDB不是数据库, 而是一个SQLITE管理框架. 

4.CoreData切记coredata不是数据库, 他的存储核心思想是托管对象。只是咱们经常用的存储文件为SQLite.还可以用XML, 二进制等方式.

10.iOS的动态性 

 1.动态类型。 如id类型。实际上静态类型因为其固定性和可预知性而使用得更加广泛。静态类型是强类型,而动态类型属于弱类型。运行时决定接收者。

2. 动态绑定。让代码在运行时判断需要调用什么方法,而不是在编译时。

3. 动态载入。让程序在运行时添加代码模块以及其他资。

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

深拷贝拷贝的是内容,浅拷贝拷贝的是指针。如果子类对象的地址改变就是深拷贝反之浅拷贝。

12.什么是安全释放

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

13.怎样实现一个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的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。主要是是为了减少 cpu无谓的空转。每个线程都有Runloop, 主线程的Runloop时默认开启的, 手动开辟的子线程Runloop是默认不开启 的, 如果需要开启, 需要调用API[[NSRunloop  currentRunloop] run]开启.

最常见的需要开启Runloop的是在子线程里面调用计时器(NSTimer), 如果不开启runloop循环方法就不能正常执行.

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:没有正在使用nib视图页面,子类将会创建自己的自定义视图层

viewDidLoad:试图被加载后调用

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

viewDidUnload:当系统内存吃紧的时调用,释放掉当前未在window中显示的试图和对应的控制器

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

1、main函数创建UIApplication实例和UIApplication代理实例

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

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

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

防止循环引用,

Teacher *teacher=[[Teacher alloc] init];

Student * student=[[Student alloc] init];t

eacher.delegate=student;

student.delegate= teacher;

在teacher中dealloc会release当前的Delegate,就会触发student对象release,继而也会导致student执行dealloc,在student中也会release自己的delegate,产生循环了。

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

两种:

1、从资源读取 , 先在缓存里面查看图片是否存在, 没有的话将图片添加进缓存再使用. 有的话直接使用缓存里的. 图片用的次数比较多, 使 用这种方式. 缺点是效率低下.UIImage *image = [UIImage imageNamed:@”1.png”];

2 .从手机本地读取, 直接加 载图片. 在图片使用率低的图片时 使用.  //读取本地图片非resourceNSString *aPath3=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];[UIImage imageWithContentsOfFile:aPath3]

 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 (inti =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继承于NSObject,不能响应事件。侧重于对内容的绘制,以及对内容进行动画处理,依赖于UIView来显示。

UIWindow是特殊的UIView,通常一个app只有一个UIWindow,我们可以创建一个视图控制器,并添加到 UIWindow上面,这样的话这个视图控制器就是app的第一响应者(First Responder).

23.frame和bounds区别:

frame:view在父视图坐标 中的位置

bounds:view在本地坐标中的位置

center:view的中心点在父视图中的位置

也可仔细阅读:http://blog.csdn.net/mad1989/article/details/8711697

24.写一个完整的代理

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

XML是扩展通用标记语言 (SGML),适合 Web 传输。 提供统一的方法来描述和交换数据。   

JSON(JavaScriptObject Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。

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

在出现内存警告的时候调用,释放掉暂时没使用的可重用对象。这个方法不能手动调用!!!

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

封装、继承、多态。

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

继承:可以使用现有类的所有功能,并且在无需重新编写原来的类的情况下对这些功能进行扩展。

多态:不同的对象以自己的方式响应相同的的消息叫做多态。

28.简单说一下懒加载

用到的时候初始化,不用的话不初始化只是一个指针,不占用内存空间

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

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

extension:为一个类声明私有方法和变量。

继承是创建了一个新的类。

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

#include C语言中引入头文件,可能出现交叉编译

#import在OC中引入自己创建的头文件

#import””是引入自己创建类的头文件

#import<>是引入系统类的头文件

#import不会出现交叉编译

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

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

MVC是Model-VIew-Controller模型-视图-控制器。 model数据模型,view是对这些数据的显 示,viewcontroller就是把model拿到view中显示,起到model和view之间桥梁的作用。MVC可以实现程序最大程 度的可重用性。MVC各元素分开也能便于代码的更新、维护以及提高代码的重用性.

单例模式,delegate设计模式,target-action设计模式

 32.字符串替换方法:

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

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

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

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

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

默认每个沙盒有3个文件夹:Documents, Library 和 tmp。

Documents:保存程序中建立的或在程序中浏览到的文件数据

iTunes备份和恢复的时候会包括此目录

Library/Caches:存放缓存文件,iTunes不会备份此目录,目录下文件在应用退出时不删除

tmp:提供一个即时创建临时文件的地方。

iTunes在与iPhone同步时,备份所有的Documents和Library文件。

iPhone在重启时,会丢弃所有的tmp文件。

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

-(BOOL) isKindOfClass: classObj判断是否是这个类或者是这个类子类的实例

-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例

36.iOS中UIViewController的生命周期及iOS程序执行顺序:

视图控制对象生命周期

init-初始化程序

viewDidLoad-加载视图

viewWillAppear-UIViewController对象的视图即将加入窗口时调用;

viewDidApper-UIViewController对象的视图已经加入到窗口时调用;

viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;

viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;

viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;

viewDidUnload-当内存过低,释放一些不需要的视图时调用。

具体可参考:http://blog.csdn.net/huifeidexin_1/article/details/7566226

37.  简述多线程。

 答:Grand Central Dispatch简称GCD 解决多核并行运算的一种方案,主要有两种队列:并行、串行。

NSOperationQueue以队列的形式实现了多线程,基于GCD的封装。

NSThread 轻量级多线程,不常用  缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

39. 该问题涉及编译器的“内存对齐”问题: 

例如:

对于结构体来说,按成员中所占字节最大的是float类型,占用4个字节,一共有3个成员,所以总的占用字节为:4 * 3 = 12.可通过编译器命令来设定: #progma pack (2) 

40. TCP/IP 建立连接的过程:

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立连接;

第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手。

(所谓的三次握手,就是要有三次连接信息的发送、接收过程。TCP连接的建立需要进行三次连接信息的发送、接收。)

41.什么是UDP和TCP的区别是什么?

TCP 的全称是传输控制协议,这种协议可以提供面向连接的、可靠的、点到点的通信。

UDP 的全称是用户数据包协议。他可以提供非连接的不可靠的点到多点的通信,是osi参考模型中一种无连接的传输层协议,提供面向事务的简单的不可靠信息传输,_IETFRFC 768 是UDP 的正式规范;

选择何种协议,看程序注重那个方面,可靠抑或快速。

42.static关键字的作用

静态全局变量

优点:

1、节省内存。静态变量只存储一处,但供所有对象使用。

2、它的值是可以更新的。

3、可提高时间效率。只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。

43.iOS系统框架分为几层,分别是什么

  

 1、Core OS是核心操作系统层,包括内存管理、文件系统、电源管理以及一些其他的操作系统任务。

 2、Core Services是核心服务层,用来访问iOS的一些服务。

 3、Media是媒体层,通过它我们可以在应用程序中使用各种媒体文件,进行音频与视频的录制,图形的绘制,以及制作基础的动画效果。 

  4、Cocoa Touch是可触摸层,本质上来说它负责用户在iOS设备上的触摸交互操作。

你可能感兴趣的:(iOS)