iOS面试题 集锦(1)
2015-11-13 21:14
465 查看
这是我从许多iOS面试题中筛选和提炼出来的,在这里留下来备用
1 static关键字的作用 (表示看到这题,顿时蒙圈,static是啥啊)
(1) 函数体内static变量的作用范围为该函数体,不同与auto变量,该变量的内存只被分配一次,因此其值在下次调用的时候任然维持上次的值的 (靠,说白了 就是不变的啦。。)
(2) 在模块内的static全局变量可以被模块内的函数访问,但不能被模块外的其他函数访问。(私有的!)
(3) 在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。
(4)在类中的static成员变量属于整个类所拥有的,对类的所有对象只有一份拷贝(表示不懂。。)
2 线程与进程的区别和联系(这个题目,好多面试题上都有,说明十分重要,make)
进程和线程的主要区别在于他们是不同操作系统资源管理的方式。进程有独立的地址控件,一个进程崩溃后,在保护模式(什么是保护模式?)下不会对其他进程产生影响,而线程只是一个进程中不同的执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但进程切换的时候耗费资源较大,效率要差一点
3 堆和栈的区别(同样是基础题)
管理方式:对于栈来讲,是由编译器自动管理的,无需我们手动控制;对于堆来说,需要程序员自己管理控制,容易内存泄露
申请大小:栈是一块连续的内存控件,可获得的控件较小;堆是不连续的内存区域,可获得控件灵活,也比较大。
4 什么是键-值,键路径又是什么(就是KVC 和KVO。。)
键-值模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值—它是一种间接访问对象的属性的机制(KVC中间的赋值。。。)
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列,也就是观察者模式,基于KVC和通知中心,观察的是实例变量。能实时监听变化(就是KVO观察者模式)
5 目标-动作机制(target-action 设计模式)
目标是动作消息的接收者。一个控件,或者一个常见的单元,以插座变量的形式保有其动作的消息目标
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法
程序需要某些机制来进行事件和指令的翻译,这个机制就是目标-动作机制
6 分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?
Categories 是对于现有的一个类的扩展,Extensions是定义私有的变量。
Extensions是子类对于父类已经拥有的成员变量的继承,创
4000
建了新的类。
Catigories还是原有的类,只是对于原有的类进行了一定功能的扩充,但是不能添加属性和实例变量
Catigories不能添加实例变量的原因是,类的方法中使用的都是静态变量,不能使用实例变量
7 类工厂方法是什么(原谅我再次没听说过。。。。)
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化和在一个步骤中,返回被创建的对象,并且进行自动释放处理。
这些方法的形式是+(type)className… (其中className不包含任何前缀)。
类工厂方法可能不仅仅为了方便使,它们不但可以将分配和初始化合在一起,还可以为初始化提供对象的分配信息。
类工厂方法可以避免为可能没有用的对象盲目分配内存
8 单例的实现(伪单例)
9 iOS动态识别、动态类型和动态绑定
动态识别:来自不同类可以定义共享相同名称的方法。
动态类型:能使程序直到执行时才确定对象所属类型。
动态绑定:能使程序直到执行时才确定要对对象调用的实际方法。
10 Objective - C 的优缺点
优点:
(1)Cateogries(类别)
(2)Posing
(3)动态识别
(4)指标计算
(5)弹性通讯传递
(6)可与C++混编
缺点:
(1)不支持援命名空间
(2)不支持运算符重载
(3)不支持多继承
(4)使用动态运行时类型时,所有的方法都是函数调用,所以很多编译时优化方法都用不到(如内联函数)
11 面向对象的三大特征,并作简单的介绍
封装:代码模块化,方便以后使用
继承:子类继承父类的所有方法和属性
多态:父类指针指向子类对象
12 ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?
当应用的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,这时系统会调用这个方法向所有的ViewController发送内存警告。调用了这个方法之后,对view进行释放并且调用viewDidUnload方法
默认操作:把里面没有用的对象进行释放
13 分析json、xml的区别?json、xml解析方式的底层是如何处理的?
Json:键值对,数据小,不复杂,便与解析,有框架支持,适合轻量级传输。
XML:分为DOM解析和SAX解析。DOM解析的原理是:遇到开标签入栈,关标签出栈。SAX解析是逐行解析,没办法获取文件的层级关系
14 简述你对UIView、UIWindow和CALayer的理解
UIWindow是应用的窗口,继承与UIResponder
UIView继承与UIView,是创建窗口中的一个视图,可以响应交互事件,一个程序只有一个主Window,可以有多个View。
CALayer是一个图层,一个View可以有多个图层,不可以响应交互事件
15 写一个完整的代理,包括声明,实现
第一步:在需要协议的类里面制定协议
第二步:给外界提供设置Delegate属性的接口
第三步:指定代理
第四步:代理遵守协议
第五步:代理实现协议里面需要实现的方法
第六步:委托方通知代理开始执行方法
16 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?
retain配对使用的方法是release;alloc对应的才是dealloc,内存的释放用release,而dealloc是用来销毁内存的。
17 变量的@protected ,@private,@public,@package,声明各有什么含义?
@protected : (受保护的)该类和所有子类中的方法可以直接访问这样的变量
@private :(私有的) 该类中的方法可以访问,子类不可以访问
@public : (公共的)可以被所有类访问
@package : 本包内使用,夸包不可以使用
18 谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
(1) 多线程可以解决负载不均衡的问题,充分利用cpu资源
(2) 大多数情况下 要用到多线程的主要是需要处理大量的IO操作时或者处理的情况需要花大量的时间等等
(3) iOS中有三种主要方法实现多线程 1,NSThread 2,NSOperation 3,GCD
19 iOS类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。
不能多继承,用category 和 extension 可以实现
category 是可以为已有的类添加函数,但是不允许为已有的类添加新属性或者成员变量
20 iOS本地数据存储都有哪几种方式?
(1)plist文件
(2)NSUserDefaults
(3)SQLite3
(4)NSKeyedArchiver(加密形式)
(5)Core Data
1 static关键字的作用 (表示看到这题,顿时蒙圈,static是啥啊)
(1) 函数体内static变量的作用范围为该函数体,不同与auto变量,该变量的内存只被分配一次,因此其值在下次调用的时候任然维持上次的值的 (靠,说白了 就是不变的啦。。)
(2) 在模块内的static全局变量可以被模块内的函数访问,但不能被模块外的其他函数访问。(私有的!)
(3) 在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。
(4)在类中的static成员变量属于整个类所拥有的,对类的所有对象只有一份拷贝(表示不懂。。)
2 线程与进程的区别和联系(这个题目,好多面试题上都有,说明十分重要,make)
进程和线程的主要区别在于他们是不同操作系统资源管理的方式。进程有独立的地址控件,一个进程崩溃后,在保护模式(什么是保护模式?)下不会对其他进程产生影响,而线程只是一个进程中不同的执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但进程切换的时候耗费资源较大,效率要差一点
3 堆和栈的区别(同样是基础题)
管理方式:对于栈来讲,是由编译器自动管理的,无需我们手动控制;对于堆来说,需要程序员自己管理控制,容易内存泄露
申请大小:栈是一块连续的内存控件,可获得的控件较小;堆是不连续的内存区域,可获得控件灵活,也比较大。
4 什么是键-值,键路径又是什么(就是KVC 和KVO。。)
键-值模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值—它是一种间接访问对象的属性的机制(KVC中间的赋值。。。)
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列,也就是观察者模式,基于KVC和通知中心,观察的是实例变量。能实时监听变化(就是KVO观察者模式)
5 目标-动作机制(target-action 设计模式)
目标是动作消息的接收者。一个控件,或者一个常见的单元,以插座变量的形式保有其动作的消息目标
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法
程序需要某些机制来进行事件和指令的翻译,这个机制就是目标-动作机制
6 分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?
Categories 是对于现有的一个类的扩展,Extensions是定义私有的变量。
Extensions是子类对于父类已经拥有的成员变量的继承,创
4000
建了新的类。
Catigories还是原有的类,只是对于原有的类进行了一定功能的扩充,但是不能添加属性和实例变量
Catigories不能添加实例变量的原因是,类的方法中使用的都是静态变量,不能使用实例变量
7 类工厂方法是什么(原谅我再次没听说过。。。。)
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化和在一个步骤中,返回被创建的对象,并且进行自动释放处理。
这些方法的形式是+(type)className… (其中className不包含任何前缀)。
类工厂方法可能不仅仅为了方便使,它们不但可以将分配和初始化合在一起,还可以为初始化提供对象的分配信息。
类工厂方法可以避免为可能没有用的对象盲目分配内存
8 单例的实现(伪单例)
// 普通单例实现 + (UserInfo *)shareInstance { @synchronized(self){ if (user == nil) { user = [[UserInfo alloc] init]; } return user; } } // GCD方式实现 + (UserInfo *)shareInstance { static dispatch_once_t onceToken dispatch_onec(&onceToken, ^{ if(user == nil) { user = [[UserInfo alloc] init]; } }); }
9 iOS动态识别、动态类型和动态绑定
动态识别:来自不同类可以定义共享相同名称的方法。
动态类型:能使程序直到执行时才确定对象所属类型。
动态绑定:能使程序直到执行时才确定要对对象调用的实际方法。
10 Objective - C 的优缺点
优点:
(1)Cateogries(类别)
(2)Posing
(3)动态识别
(4)指标计算
(5)弹性通讯传递
(6)可与C++混编
缺点:
(1)不支持援命名空间
(2)不支持运算符重载
(3)不支持多继承
(4)使用动态运行时类型时,所有的方法都是函数调用,所以很多编译时优化方法都用不到(如内联函数)
11 面向对象的三大特征,并作简单的介绍
封装:代码模块化,方便以后使用
继承:子类继承父类的所有方法和属性
多态:父类指针指向子类对象
12 ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?
当应用的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,这时系统会调用这个方法向所有的ViewController发送内存警告。调用了这个方法之后,对view进行释放并且调用viewDidUnload方法
默认操作:把里面没有用的对象进行释放
13 分析json、xml的区别?json、xml解析方式的底层是如何处理的?
Json:键值对,数据小,不复杂,便与解析,有框架支持,适合轻量级传输。
XML:分为DOM解析和SAX解析。DOM解析的原理是:遇到开标签入栈,关标签出栈。SAX解析是逐行解析,没办法获取文件的层级关系
14 简述你对UIView、UIWindow和CALayer的理解
UIWindow是应用的窗口,继承与UIResponder
UIView继承与UIView,是创建窗口中的一个视图,可以响应交互事件,一个程序只有一个主Window,可以有多个View。
CALayer是一个图层,一个View可以有多个图层,不可以响应交互事件
15 写一个完整的代理,包括声明,实现
第一步:在需要协议的类里面制定协议
// TouchView.h @class TouchView; // 声明本类 @protocol TouchViewDelegate <NSObject> @optional //可选方法 // 开始被点击 - (void)touchViewBeginTouched:(TouchView *)touchView; // 结束被点击 - (void)touchViewEndTouched:(TouchView *)touchView; @end
第二步:给外界提供设置Delegate属性的接口
// TouchView.h // 在定义Delegate属性的时候 需要使用assign关键字 防止产生循环引用 @property(nonatomic,assign)id<TouchViewDelegate>delegate;
第三步:指定代理
//RootVC.m TouchView *touchview = [[TouchView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; touchview.backgroundColor = [UIColor greenColor]; touchview.delegate = self;//代理为RootVC [self.view addSubview:touchview]; [touchview release];
第四步:代理遵守协议
//RootVC.m #import "TouchView.h"// 引入头文件 @interface RootViewController ()<TouchViewDelegate>// 延展上接收协议 @end
第五步:代理实现协议里面需要实现的方法
//RootVC.m - (void)touchViewBeginTouched:(TouchView *)touchView { self.view.backgroundColor = [UIColor redColor]; } - (void)touchViewEndTouched:(TouchView *)touchView { touchView.backgroundColor = [UIColor blackColor]; }
第六步:委托方通知代理开始执行方法
// TouchView.m - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 如果代理存在或者代理能够响应代理的方法 if (_delegate && [_delegate respondsToSelector:@selector(touchViewBeginTouched:)]) { [_delegate touchViewBeginTouched:self]; } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (_delegate && [_delegate respondsToSelector:@selector(touchViewEndTouched:)]) { [_delegate touchViewEndTouched:self]; } }
16 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?
retain配对使用的方法是release;alloc对应的才是dealloc,内存的释放用release,而dealloc是用来销毁内存的。
17 变量的@protected ,@private,@public,@package,声明各有什么含义?
@protected : (受保护的)该类和所有子类中的方法可以直接访问这样的变量
@private :(私有的) 该类中的方法可以访问,子类不可以访问
@public : (公共的)可以被所有类访问
@package : 本包内使用,夸包不可以使用
18 谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
(1) 多线程可以解决负载不均衡的问题,充分利用cpu资源
(2) 大多数情况下 要用到多线程的主要是需要处理大量的IO操作时或者处理的情况需要花大量的时间等等
(3) iOS中有三种主要方法实现多线程 1,NSThread 2,NSOperation 3,GCD
19 iOS类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。
不能多继承,用category 和 extension 可以实现
category 是可以为已有的类添加函数,但是不允许为已有的类添加新属性或者成员变量
20 iOS本地数据存储都有哪几种方式?
(1)plist文件
(2)NSUserDefaults
(3)SQLite3
(4)NSKeyedArchiver(加密形式)
(5)Core Data
相关文章推荐
- 一个关于if else容易迷惑的问题
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法
- Lua函数用法研究
- Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记
- 一道sql面试题附答案