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

IOS基础面试题

2016-03-09 20:11 495 查看
声明:整理于网络嘿嘿

基础

属性及引用

1.#import,include与@class 区别;#import<>与#import”“的区别;

答:#import是oc导入头文件的关键字,#include是C++导入头文件大关键字。#import会自动导入一次,不会重复导入引起交叉编译。而#include如重复导入一个头文件会报错;@class仅告诉编译器该类文件存在,不会像#import与include将.h文件拷贝;

#import<>导入系统文件,#import导入用户自定义类文件

2.readwrite,readonly,nonatomic, assign ,retain, weak,strong,copy属性作用;

答:readwrite,readonly 设置可供访问级别为:读写与只读

nonatomic:非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能

copy:对象拷贝

assign: 常理属性。简单赋值,不更改索引计数

retain:对象属性,引用计数器+1

weak 和 strong 属性只有在你打开ARC时才会被要求使用。其中strong就相当于retain属性,而weak相当于assign。

3.
浅复制和深复制的区别?

答:浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。相当与克隆

4.写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy)NSString *name

答:

- (void)setName:(NSString *) str
{
[str retain];
[name release];
name = str;
}
- (void)setName:(NSString *)str
{
id t = [str copy];
[name release];
name = t;
}


5.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么?

答:在OC中nsstring,nsnumber,nsarray,nsmutablearray,nsdata是数字对象,可以进行拆装箱操作!

c语言的基本数据类型int,只是一定字节的内存空间,用于存放数值;而object-c的nsnumber包含有父nsobject的方法和nsnumber自己的方法,可以完成复杂的操作。

6.static 关键字的作用:

答:函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值;

在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;

在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明 它的模块内;

在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;

在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。

内存管理

1.内存管理的方式有哪些?

答:MRC ARC GC

2.Objective-C如何对内存管理的,说说你的看法和解决方法?

答:每个对象都有一个引用计数器,每个新对象的计数器是1,当对象的计数器减为0时,就会被销毁

通过retain可以让对象的计数器+1、release可以让对象的计数器-1

还可以通过autorelease pool管理内存

如果用ARC,编译器会自动生成管理内存的代码

3.谈谈你对ARC 的认识和理解?

答:ARC实际上还是MRC,只是在编译的时候由编译器给对象自动添加上retain与release

4.内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象

需要手动释放?在和property结合的时候怎样有效的避免内存泄露?

答:(1)谁申请,谁释放

(2)遵循Cocoa Touch的使用原则;

内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。

关键字alloc 或new 生成的对象需要手动释放;

设置正确的property属性,对于retain需要在合适的地方释放,

5.在一个对象释放前.如果他被加到了notificationCenter 中.不在notificationcenter中remove这个对象可能会出现什么问题?

答:访问到野指针. EXE_BAD_ACCESS

6.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为什么?

NSMutableArray* ary = [[NSMutableArray array] retain];
NSString *str = [NSString stringWithFormat:@"test"];
[strretain];
[aryaddObject:str];
NSLog(@"%@%d",str,[str retainCount]);
[strretain];
[strrelease];
[strrelease];
NSLog(@"%@%d",str,[str retainCount]);
[aryremoveAllObjects];
NSLog(@"%@%d",str,[str retainCount]);


答:

str的retainCount创建+1,retain+1,加入数组自动+1

3

retain+1,release-1,release-1

2

数组删除所有对象,所有数组内的对象自动-1

1

7.什么是安全释放?

答:[_object release] ; _object = nil;

8.autorelease的对象是在什么时候被release的?

答:autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的 Autoreleasepool中,当该pool被释放时,该pool中的所有Object会被调用Release。对于每一个Runloop,系统会隐式创建一个Autoreleasepool,这样所有的releasepool会构成一个象CallStack一样的一个栈式结构,在每一个 Runloop结束时,当前栈顶的Autoreleasepool会被销毁,这样这个pool里的每个Object(就是autorelease的对象)会被release。

设计模式

1.MVC的理解?

答:MVC模式考虑三种对象:模型对象、视图对象和控制器对象。
模型对象负责应用程序的数据和定义操作数据的逻辑;
视图对象知道如何显示应用程序的模型数据;
控制器对象是M与V之间的协调者。

2.通知和协议的不同之处?

答:协议有控制链(has-a)的关系,通知没有。通知是一对多的关系,代理是一对一关系

3.代理的作用?

答:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度

4 .类别的作用?继承和类别在实现中有何区别?

答:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。

类别主要有3个作用:

(1)将类的实现分散到多个不同文件或多个不同框架中。

(2)创建对私有方法的前向引用。

(3)向对象添加非正式协议。

继承可以增加,修改方法,并且可以增加属性。

5.类别(category)和类扩展(extension)的区别。

答:category和extensions的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。
extensions可以认为是一个私有的Category。

6.kvc是什么?kvo是什么?有什么特性?

答:kvc:键 – 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。


kvo:键值观察机制,他提供了观察某一属性变化的方法

7:KVO实现原理?


答:(1)、当一个object有观察者时,动态创建这个object的类的子类

(2)、对于每个被观察的property,重写其set方法

(3)、在重写的set方法中调用- willChangeValueForKey:和- didChangeValueForKey:通知观察者

(4)、当一个property没有观察者时,删除重写的方法

(5)、当没有observer观察任何一个property时,删除动态创建的子类

8.notification是同步还是异步? kvo是同步还是异步?notification是全进程空间的通知吗?kvo呢?

答:通知是同步,若要异步实现可以将其加入通知队列,通知全进程空间的;

9.解释一下懒汉模式?


答:懒汉模式,只在用到的时候才去初始化,延迟加载。

延时加载可以避免内存过高,异步加载可以避免线程堵塞。

10.响应者链是什么?

答:当事件发生的时候,响应链首先被发送给第一个响应者(往往是事件发生的视图,也就是用户触摸屏幕的地方)。事件将沿着响应者链一直向下传递,知道被接受并作出处理。一般来说,第一响应这是个视图对象或者其子类,当其被触摸后事件就交由它处理,如果他不处理,时间就会被传递给视图控制器对象UIViewController(如果存在),然后是它的俯视图对象(superview),以此类推知道顶层视图。接下来会沿着顶层视图(top view)到窗口(UIwindow 对象) 再到程序的(UIApplication对象),如果整个过程都没有响应这个事件,则该事件被丢弃,一般情况下,在响应链中只要有对象处理事件,事件就会被传递。

典型的响应路线图如:

First Responser –> The Window –>The Applicationn –> App Delegate

11.手写一个单例

答:

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"只执行一次");
});


12.block 实现原理

答: Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。

13.如何使用Xcode设计通用应用?

答案:使用MVC模式设计应用,其中Model层完成脱离界面,即在Model层,其是可运行在任何设备上,在controller层,根据iPhone与iPad(独有UISplitViewController)的不同特点选择不同的viewController对象。在View层,可根据现实要求,来设计,其中以xib文件设计时,其设置其为universal。

14.UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?

答:组合模式composition,所有的container view都用了这个模式

观察者模式observer,所有的UIResponder都用了这个模式。

模板(Template)模式,所有datasource和delegate接口都是模板模式的典型应用

runtime runloop

1.我们说的oc是动态运行时语言是什么意思?

答:运行时:主要是OC将数据类型的确定由编译时,推迟到了运行时。使程序直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。

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

2.id声明的对象有什么特征

答:具有运行时特征,即在程序运行时才确定对象的类型。

3.runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的timer事件,touch事件等。

答:loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run loop的目的是使你的线程在有工作的时候工作,没有的时候休眠;将time添加到当前runloop,并设置runloop模式为通用模式

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

答:编译时:NSString 运行时:NSData

5.timer的间隔周期准吗?为什么?怎样实现一个精准的timer?

答:不准,不是cpu周期。没法实现精准timer,iOS不是realtime os。

代码编写

1.获取项目根路径,并在其下创建一个名称为userData的目录。

// 获取根路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:];
// 创建文件系统管理器
NSFileManager *fileManager = [[NSFileManager alloc]init];
// 判断userData目录是否存在
if(![fileManager fileExistsAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]]) {
// 不存在,创建一个userData目录
[fileManager createDirectoryAtPath:[NSString stringWithFormat:@"%@/userData", documentsDirectory]withIntermediateDirectories:false attributes:nil error:nil];
}


2.截取字符串”20|http://www.621life.com“ 中 ‘|’字符前面及后面的数据,分别输出它们

答:NSArray *array = [str componentsSeparatedByString:@”|”];

遍历后判断非空

3.用NSLog函数输出一个浮点类型,结果四舍五入,并保留一位小数

NSLog(@”%0.1f”,4.4524);

4.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

答:#define YEAR (60 * 60 * 24 * 365)

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

答:#define MIN(A,B) ((A) <= (B) ? (A) : (B))

VC

1.frame和bounds有什么不同?


答案:frame指的是:该view在父view坐标系统中的位置和大小。

bounds指的是:该view在本身坐标系统中 的位置和大小。

2.简述视图控制器的生命周期。



3.tableView的重用机制?

答:UITableView通过重用单元格来达到节省内存的目的:通过为每个单元格指定一个重用标识符(reuseIdentifier),即指定了单元格的种类,以及当单元格滚出屏幕时,允许恢复单元格以便重用.对于不同种类的单元格使用不同的ID,对于简单的表格,一个标识符就够了.

4.给出委托方法的实例,并且说出UITableVIew的Data Source方法

答案:UITableViewDelegate就是委托机制的典型应用,是一个典型的使用委托来实现适配器模式,其中UITableViewDelegate协议是目标,tableview是适配器,实现UITableViewDelegate协议,并将自身设置为talbeview的delegate的对象,是被适配器,一般情况下该对象是UITableViewController。

Data Source方法有

tableView: numberOfRowsInSection:

tableView: cellForRowAtIndexPath:

5.

Quatrz 2D的绘图功能的三个核心概念是什么并简述其作用。

答:上下文:主要用于描述图形写入哪里;

路径:是在图层上绘制的内容;

状态:用于保存配置变换的值、填充和轮廓,alpha值等。

对象与类

1.关于多态性

答:多态,子类指针可以赋值给父类。

2.Object-c的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承好还是分类好?为什么?

答案:Objective-c只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,cocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的。

3.类NSObject的那些方法经常被使用?

  答案:类方法alloc、class、 description 对象方法init、dealloc、– performSelector:withObject:afterDelay:等经常被使用

4.什么时候使用NSMutableArray,什么时候使用NSArray?

答:当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数组在初始化后,便不再改变的,使用NSArray。需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变,即不能往NSAarry的数组里新增和删除元素,但不表明其数组內的元素的内容不能发生改变。NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray需要注意。

多线程

1.堆和栈的区别?

答:堆先进先出,栈先进后出;

管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制。

分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配

2.描述一下iOS多线程

答: iOS中的多线程,是Cocoa框架下的多线程,它对线程做了封装,有些封装,可以让我们创建的对象,本身便拥有线程,也就是线程的对象化抽象,从而减少我们的工程,提供程序的健壮性。

GCD,NSOperation与QueueNSThread,另外通知、Timer和异步函数等都有使用多线程

3.线程与进程的区别和联系?

答:

1). 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性

2). 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。

3). 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。

4.)线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

5). 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

4.Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?

答:线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;

在主线程执行代码,方法是performSelectorOnMainThread

延时执行代码performSelector:onThread:withObject:waitUntilDone:

其他

1.iOS常用gdb调试命令

答:po 可用来打印所有NSObject对象;

p 打印所有的基本类型;

call 一般只在不需要显示输出,或是方法无返回值时使用call;

2.在iPhone应用中如何保存数据?

答案:有以下几种保存机制:

通过web服务,保存在服务器上

通过NSCoder固化机制,将对象保存在文件中

通过SQlite或CoreData保存在文件数据库中

3.冒泡算法。

4.socket编程简述

5.简述push原理,push的证书和其它的右什么不一样?

答:推送通知更是一种技术,简单点就是客户端获取资源的一种手段。

普通情况下,都是客户端主动的pull。推送则是服务器端主动push。

6.obc的垃圾回收机制?

答:obc2.0有Garbage collection,但是iOS平台不提供。obc一般都是手动管理内存但也有自动释放池。

7 .ios开发者证书与发布证书区别

开发证书是用来测试的,需要将设备绑定到账号,才可以识别,在真机调试的时候可以看程序打印;发布证书主要用来打包发布APP用的,也可用于真机调试,但是看不到程序打印。

进阶

NSString内存分配与管理

异步模式的socket在connect之后如何知道connect是否成功

SDWebImage 实现原理

iOS 消息推送原理

AutoLayout布局原理

NSRunLoop原理简单理解

Runtime与Quartz 2D

《招聘一个靠谱的iOS》(上)

《招聘一个靠谱的iOS》(下)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: