打造最受名企欢迎的iOS程序员(上)
1、堆和栈什么区别?
答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工 控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
2、数组和链表什么区别?
答:数组是将元素在内存中连续存放,由于每个元素占用内存相同, 可以通过下标迅速访问数组中任何元素。 链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通 过存在元素中的指针联系到一起。
3、delegate和notification什么区别,什么情况使用?
答:Delegate:消息的发送者(sender)告知接收者(receiver)某个事 件将要发生,delegate同意然然后发送者响应事件, delegate机制使得接收者可以改变发送者的行为。 通常发送者和接收者的关系是直接的一对多的关系。 Notification: 消息的发送者告知接收者事件已经发生或者将要发送,仅 此而已,接收者并不能反过来影响发送者的行为。 通常发送者和接收者的关系是间接的多对多关系。
4、什么是MVC,为什么使用MVC,有什么好处?
答: 分别为: 模型(Model),视图(View)和控制Controller)。 模型(Model) “数据模型”(Model)用于封装与 应用程序的业务逻辑相关的数据以及对数据的处理方法。 “模型”有对数据直接访问的权力,例如对数据库的访 问。 视图(View) 视图层能够实现数据有目的显示。 控制器(Controller) 控制器起到不同层面间的组 织作用,用于控制应用程序的流程。
5、从一个数组中找出重复的元素打印出来
NSArray *arr =[NSArray arrayWithObjects: @"1",@"2",@"1",@"7",@"4",@"5",@"2", @"6",@"5",nil];
NSMutableArray *arrmu = [[NSMutableArray alloc]init];
// 过滤
NSMutableArray *sameArray = [[NSMutableArray alloc]init];
//找出相同的
for (int i = 0 ; i < [arr count]; i++) {
id str = [arr objectAtIndex:i];
if ([arrmu count] == 0) {
[arrmu addObject: str];
} else {
BOOL flag = NO;
for (int j = 0; j < [arrmu count]; j++ ) {
if ([stris Equal:[arrmu objectAtIndex: j]]) {
[sameArray addObject: str];
flag =YES;
break;
} else {
flag =NO;
}
}
if (flag == NO) {
[ arrmuaddObject:str];
}
}
}
NSLog(@"sameArray : %@",sameArray);
还有两种直接找出的方法,上代码: 一:
NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"1",nil];
NSSet *set = [NSSet setWithArray: arr];
NSLog(@"%@",[setallObjects]);
二:
NSArray *arr =@[@1,@2,@1];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (NSNumber *numberin arr) {
[dict setObject: number forKey: number];
}
NSLog(@"%@",[dict allValues]);
6、UITableView能否绑定多个数据源?
答:不能
7、一个UIViewController能否管理多个UITableView ?
答:可以
8.说一下响应链的响应机制
9、同步请求和异步请求什么区别?
答:发送同步请求,程序将停止用户交互,直至服务器返回数据完成, 才可以进行下一步操作, 异步请求不会阻塞主线程,而会建立一个新的线程来操作,用 户发出异步请求后,依然可以对UI进行操作,程序可以继续运行
10、iOS中的多线程操作、多线程方式
答:iOS提供了方便的多线程调用机制:NSOperation和 NSOperationQueue。它的使用方法也很简单, 一般都是将NSOperation对象加入到NSOperationQueue队列中, 加入后队列就开始处理,知道任务操作完成。
11、UIViewController的生命周期
答:当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执 行顺序 // 视图显示在屏幕上的顺序
- 1、 alloc 创建对象,分 配空间。
- 2、init (initWithNibName) 初始化对象,初始化数据。
- 3、loadView 从nib载入视图, 这一步不需要去干涉。除非没有使用xib文件创建视图。
- 4、viewDidLoad 加载完毕,可以进 行自定义数据以及动态创建其他控件。
- 5、viewWillAppear 视图将出现在屏幕之 前,马上这个视图即将显示在屏幕上。
- 6、viewDidAppear 视图已在屏幕上渲染完 成。 // 视图将被从屏幕上移除的顺序
- 7、viewWillDisappear 视图将被从屏幕上移 除之前执行。
- 8、viewDidDisappear 视图已经被从屏幕上 移除。
- 9、dealloc 视图被销毁,此 时需要在init和viewDidLoad中创建的对象进行释放。
- 10、viewDidUnload 出现内存警告在内 存不足时执行,并对所有非当前显示的controller执行。 本视图的所有子视图将被销毁,以释放内存,此时开发者需 要手动对viewLoad、viewDidLoad中创建的对象释放内存。 因为当这个视图再次显示在屏幕上的时候,viewLoad、 viewDidLoad 再次被调用,以便再次构造视图
12、Autorerelease对象什么时候释放?
答:autorelease实际上只是把对release的调用延迟了,对于每 一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。
13、iOS数据持久化方式
答:四种:属性列表、对象归档、SQLite3和Core Data
14、Object-c的类可以多重继承么?可以实现多个接口么? Category是什么?重写一个类的方式用继承好还是分类好?为什 么?
答:Object-c的类不可以多重继承;可以实现多个接口,通过 实现多个接口可以完成C++的多重继承;Category是类别,一般情况 用分类好,用Category去重写类的方法,仅对本Category有效,不会 影响到其他类与原有类的关系。
15. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import”"又什么区别?
答:#import是Objective-C导入头文件的关键字,#include是 C/C++导入头文件的关键字,使 用#import头文件会自动只导入一次, 不会重复导入,相当于#include和#pragma once;@class告诉编译器 某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件 的相互包含;#import<>用来包含系 统的头文件,#import””用来 包含用户头文件。
16.属性readwrite,readonly,assign,retain,copy,nonatomic 各 是什么作用,在那种情况下用?
答:readwrite 是可读可写特性;需要生成getter方法和setter 方法时 readonly 是只读特性 只会生成getter方法 不会生成setter方 法 ;不希望属性在类外改变 assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设 置变量时; retain 表示持有特性,setter方法将传入参数先保留,再赋值,传 入参数的retaincount会+1; copy 表示赋值特性,setter方法将传入对象复制一份;需要完全一 份新的变量时。 nonatomic 非原子操作,决定编译器生成的setter getter是否 是原子操作,atomic表示多线程安全,一般使用nonatomic
17.常见的object-c的数据类型有那些, 和C的基本数据类型有什么 区别?如:NSInteger和int
答:object-c的数据类型有 NSString,NSNumber,NSArray, NSMutableArray,NSData等等,这些都是class,创建后便是对象, 而C语言的基本数据类型int,只是一定字节的内存空间,用于存放数 值;而object-c的NSNumber包含有父类NSObject的方法和 NSNumber 自己的方法,可以完成复杂的操作。
18.Objective-C如何对内存管理的,说说你的看法和解决方法?
答:Objective-C的内存管理主要有三种方式ARC(自动内存计数)、 手动内存计数、内存池。 解决方法的话: 谁持有,谁释放。
19.如何对iOS设备进行性能测试?
答:Profile-> Instruments ->Time Profiler
20.Object C中创建线程的方法是什么?如果在主线程中执行代码, 方法是什么?如果想延时执行代码、方法又是什么?
答:线程创建有三种方法:使用NSThread创建、使用 GCD的 dispatch、使用子类化的NSOperation,然后将其加入 NSOperationQueue;在主线程执行代码,方法是 performSelectorOnMainThread,如果想延时执行代码可以用 performSelector:onThread:withObject:waitUntilDone:
...
更多内容
打造最受名企欢迎的iOS程序员(上).pdf
打造最受名企欢迎的iOS程序员(下).pdf
共104道面试题
如需要更多学习材料百度网盘链接地址,请到微信小程序搜索“斌雅资料”,序号:12,密钥:3322,查询资料获取。