您的位置:首页 > 职场人生

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 单例的实现(伪单例)

// 普通单例实现
+ (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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息