IOS基础面试题
2016-03-09 20:11
495 查看
声明:整理于网络嘿嘿
答:#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
答:
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 成员变量。
答: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是多少?第二个和第三个呢? 为什么?
答:
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。
答: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.手写一个单例
答:
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接口都是模板模式的典型应用
答:运行时:主要是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。
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))
答案:frame指的是:该view在父view坐标系统中的位置和大小。
bounds指的是:该view在本身坐标系统中 的位置和大小。
2.简述视图控制器的生命周期。
![](http://img.blog.csdn.net/20140929170950334?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdXh5aGVhdmVu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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值等。
答:多态,子类指针可以赋值给父类。
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需要注意。
答:堆先进先出,栈先进后出;
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有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:
答: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用的,也可用于真机调试,但是看不到程序打印。
异步模式的socket在connect之后如何知道connect是否成功
SDWebImage 实现原理
iOS 消息推送原理
AutoLayout布局原理
NSRunLoop原理简单理解
Runtime与Quartz 2D
《招聘一个靠谱的iOS》(上)
《招聘一个靠谱的iOS》(下)
基础
属性及引用
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》(下)
相关文章推荐
- 《剑指offer-名企面试官精讲典型编程题》读后感
- 曲率已驱动了头发——深度分析谷歌AlphaGo击败职业棋手
- 田渊栋:AlphaGo系统即使在单机上也有职业水平
- 笔试面试搜集资料汇总
- 国外程序员推荐:每个程序员都应读的书
- 面试经历
- 第一次以程序员身份进入一家公司
- Trie树的常见应用大总结(面试+附代码实现)
- 计算26进制数的距离
- .NET面试题6
- .NET面试题5
- .NET面试题4
- .NET面试题3
- .NET面试题2
- .NET面试题1
- 剑指offer——面试题10输入一个十进制整数,统计其中二进制1的个数
- 剑指offer——面试题10输入一个十进制整数,统计其中二进制1的个数
- Android面试题总结
- 成就DBA职业生涯
- 前端面试题