iOS面试题
题目:1.Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
关于多继承:
首先 object-c不能够多继承,那么有没有别的方式来替代呢?有,一种我们称之为伪继承,另一种我们可以通过ios中无处不在的@protocol委托方式来实现.在IOS中委托通过一种@protocol的方式实现,所以又称为协议.协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,
可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。
以上是面试题和所谓的答案,但是我觉得不对。继承才可以重写一个类的方法,虽然耦合度高(当然我也没看出来高在哪里),而分类只能添加新的方法,不能重写类的原有发放,只能增,不能改。而且用继承去重写类方法的话,也只对子类有效,也不会影响倒其他类与原有类的关系呀。
分类中的方法会覆盖原有的方法 分类适合将不同的方法分别写到不同的文件中 适合团队合作
2.#import 跟#include 又什么区别 #import<> 跟 #import""又什么区别?
#import比起#include的好处就是不会引起交叉编译
在 Objective-C中,#import 被当成 #include 指令的改良版本来使用。除此之外,#import
确定一个文件只能被导入一次,这使你在递归包含中不会出现问题
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import
@class就是告诉编译器有这么一个类,至于类的定义是啥不知道
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import
“”的意思是自己创建的文件,用这个首先会在当前的目录中寻找,如果找不到就到其他的位置寻找,“”和<是相对的一个是自己创建的文件一个是系统的文件
3.类变量的@protected ,@private,@public,@package声明各有什么含义?
public 声明的为公共成员变量和函数成员,在整个类内类外都可使用。
private 声明的为私有成员变量和函数成员,只在声明的类内可以使用。
protected声明的为受保护成员变量和函数成员,类外不可使用。类内可以使用。
不使用关键字默认为类内使用。
另外注意在继承的时候,他们的区别。
public 声明的在子类变为public
protected 声明的子类变为private
private 声明的在子类中不可用
@package —For 64-bit images, the instance variable can be accessed anywhere within the image that implements the class.
对于64位图像,这样的成员变量可以在实现这个类的图像中随意访问。
4.id 声明的对象有什么特性?
id是任意对象类型的,不能表示基本对象类型。id类型是通用指针类型,因为通过指针,也就是内存地址来引用对象,所以可以自由地将它们在id变量之间来回赋值。因此,返回id类型值的方法是返回指向内存中某对象的指针。然后可以将该值赋给任何对象变量。因为无论在哪里,对象总是携带它的isa成员。所以即使将它存储在id类型的通用对象变量中,也总是可以确定它的类。
http://www.cocoachina.com/ios/20131011/7142.html
5.MVC是什么?有什么特性?为什么在iPhone上被广泛运用?
6.对于语句NSString* testObject = [[NSData alloc] init];testObject 在编译时和运行时分别时什么类型的对象?
答:nsstring,nsdata
7.什么是安全释放?
答:[_instance release],_instance = nil;
8.为什么有些4.0独有的objective-c 函数在3.1上运行时会报错.而4.0独有的类在3.1上分配内存时不会报错?分配的结果是什么?
而分配内存.应该是涉及到类的创建的机制上
3.
类别(category)和类扩展(extension)的区别。
12.Singleton?
对于单例的理解
答案:11,12题目其实出的有点泛泛的感觉了,可能说是编程语言需要或是必备的基础。
基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。
进一步点,考虑下如何在多线程访问单例时的安全性。
13.What is responder chain? 说说响应链
14.Difference between frame and bounds?
frame和bounds有什么不同?
答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
15.Difference between method and selector?
方法和选择器有何不同?
答案:selector是一个方法的名字,method是一个组合体,包含了名字和实现.
详情可以看apple文档。
16.Is there any garbage collection mechanism in Objective C.?
OBC的垃圾回收机制?
答案: OBC2.0有Garbage collection,但是iOS平台不提供。
一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。
但是差了大部分资料,貌似不要和arc机制搞混就好了。
求更多~~
17.NSOperation queue?
答案:存放NSOperation的集合类。
操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。
网上部 分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。
这边又有个疑点是,对于队列来说,先进先出的 概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,
但是Bfunc是等Afunc完全操作完以后,B才开始启动 并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念。
但是转念一想其实可以参考银行的取票和叫号系统。
因此对于A比B先排队取票但是B率先 执行完操作,我们亦然可以感性认为这还是一个队列。
但是后来看到一票关于这操作队列话题的文章,其中有一句提到
“因为两个操作提交的时间间隔很近,线 程池中的线程,谁先启动是不定的。”
瞬间觉得这个queue名字有点忽悠人了,还不如pool~
综合一点,我们知道他可以比较大的用处在于可以帮组多 线程编程就好了。
1、当程序收到内存警告时候ViewController会调用didReceiveMemoryWarning这个方法。
2、调用了这个方法之后,对view进行释放并且调用viewDidUnload方法
3、从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。
答案:懒汉模式,只在用到的时候才去初始化。 也可以理解成延时加载。 我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。 一个延时载,避免内存过高,一个异步加载,避免线程堵塞。
19.Can we use two tableview controllers on one viewcontroller?
是否在一个视图控制器中嵌入两个tableview控制器?
答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,
只能说可以嵌入一个tableview视 图。当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,
而是宏观的表示视图控制者,那我们倒是可以把其看成一个视 图控制者,它可以控制多个视图控制器,比如TabbarController
那样的感觉。
计时器不准确的原因是,计时器只有在 runLoop 的一次循环中被检查,所以如果在上次循环中做了什么耗时的操作,那么计时器就被延后执行了。
正确的方法应该是新开一个线程,然后在新开的线程里设定一个 timer,并执行。
57.堆和栈的区别
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
10.异常exception 怎么捕获?不同的CPU结构上开销怎样?C中又什么类似的方法?
11.property中属性retain,copy,assgin的含义分别是什么?有什么区别?将其转换成get/set方法怎么做?有什么注意事项?
1. - (void)setInstance:(id)instance{
2. if (_instance != instance) {
3. [_instance release];
4. _instance = [instance retain];
5. }
6. }
7. copy
8. 复制代码
复制代码
1. - (void)setInstance:(id)instance{
2. if (_instance != instance) {
3. [_instance release];
4. _instance = [instance copy];
5. }
6. }
7. assgin
8. 复制代码
复制代码
1. - (void)setInstance:(id)instance{
2. if (_instance != instance) {
3. _instance = instance;
4. }
5. }
复制代码
12.委托是什么?委托的property声明用什么属性?为什么?
delegate assgin
13.浅拷贝和深拷贝区别是什么?
答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
14.Cocoa中与虚基类的概念么?怎么简洁的实现?
没有 delegate
15.自动释放池跟GC有什么区别?iPhone上有GC么?[pool release] 和[pool drain]有什么区别?
没有GC
16.
1. for(int index = 0; index < 20; index ++){
2. NSString *tempStr = @”tempStr”;
3. NSLog(tempStr);
4. NSNumber *tempNumber = [NSNumber numberWithInt:2];
5. NSLog(tempNumber);
6. }
复制代码
这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?
17.内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象需要手动释放?在和property结合的时候怎样有效的避免内存泄露?
答:谁申请谁释放。
18.在一个对象释放前.如果他被加到了notificationCenter 中.不在notificationcenter中remove这个对象可能会出现什么问题?
19.怎样实现一个 singleton的类.给出思路。
20.什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?.
21.线程是什么? 有哪些注意事项.?
22.在iphone上有两件事情要做,请问是在一个线程里按顺序做效率高还是两个线程里做效率高?为什么?
23.runloop是什么?在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的timer事件,touch事件等.
24.ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据库吗?
25.阐述一个nil对象从interface bulider产生,到载入程序运行空间,最后被释放时所经历的生命周期.
26.notification是同步还是异步? kvo是同步还是异步?notification是全进程空间的通知吗?kvo呢?
27.kvc是什么?kvo是什么?有什么特性?
28.响应者链是什么?
29.unix上进程怎么通信?
30.timer的间隔周期准吗?为什么?怎样实现一个精准的timer?
31.UIscrollVew用到了什么设计模式?还能再foundation库中找到类似的吗?
32如果要开发一个类似eclipse的软件,支持插件结构。且开放给第三方开发。你会怎样去设计它?(大概思路)
33.Objective-C如何对内存管理的,说说你的看法和解决方法?
Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
34. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?
线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的 NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是 performSelectorOnMainThread,如果想延时执行代码可以用 performSelector:onThread:withObject:waitUntilDone:
35.What are KVO and KVC?
答案:kvc:键 - 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
很多情况下可以简化程序代码。
kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。
比如我自定义的一个button
1. [self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];
2. #pragma mark KVO
3. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
4. {
5. if ([keyPath isEqualToString:@"highlighted"] ) {
6. [self setNeedsDisplay];
7. }
8. }
复制代码
对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。
对于kvc机制如何通过key寻找到value:
36.Difference between method and selector?
方法和选择器有何不同?
答案:selector是一个方法的名字,method是一个组合体,包含了名字和实现.
13sprintf,strcpy,memcpy使用上有什么要注意的地方
strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, c*****t char *src);
将 src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。具备字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst, c*****t char* src, unsigned int len);
将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。
15.readwrite,readonly,assign,retain,copy,nonatomic属性的作用
@property是一个属性访问声明,扩号内支持以下几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的方法名
2,readwrite,readonly,设置可供访问级别
2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。
5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错 误的结果。加了atomic,setter函数会变成下面这样: