iOS经典面试题

iOS面试题


题目:1.Objectc的类可以多重继承么?可以实现多个接口么?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类型的通用对象变量中,也总是可以确定它的类。



4.Difference between protocol in objective c and interfaces in java?
obc中的协议和java中的接口概念有何不同?

答案:OBC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口一样。
informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。
其实关于正式协议,类别和非正式协议我很早前学习 的时候大致看过,也写在了学习教程里
“非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工 作”。
这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。
这么看, 总觉得类别这玩意儿有点像协议的可选协议。"
现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用 interface修饰“,
现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。


http://www.cocoachina.com/ios/20131011/7142.html



5.MVC是什么?有什么特性?为什么在iPhone上被广泛运用?

  答:是一种设计模式,将代码按照视图,模型控制器的结构来设计
模型对象代表 特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制 器对象是应用程序的视图对象和模型对象之间的协调者。


kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。
比如 我自定义的一个button
[cpp] 
[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; 



6.What is purpose of delegates?
代理的作用?
答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。
另外一点,代理可以理解为java中的回调监听机制的一种类似


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

  答:nsstringnsdata

  7.什么是安全释放?

  答:[_instance release],_instance = nil;

  8.为什么有些4.0独有的objective-c 函数在3.1上运行时会报错.4.0独有的类在3.1上分配内存时不会报错?分配的结果是什么?

  运行时因为 3.1sdk 里没有对应的函数实现 .所以会找不到对应的 @selector 指针 . 错误 .


  而分配内存.应该是涉及到类的创建的机制上

   9. 为什么 4.0 独有的 c 函数在 3.1 的机器上运行不会报错 ( 在没有调用的情况下 ?) 4.0 独有的类名在 3.1 的机器上一运行就报错 ?



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


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


7.What are mutable and immutable types in Objective C?
obc中可修改和不可以修改类型。

答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。
比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。



8.When we call objective c is runtime language what does it mean?
我们说的obc是动态运行时语言是什么意思?

答案:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
这个问题其实浅涉及到两个概念,运行时和多态。
简单来说,运行时机制使我们直到运行时才去决定一个 对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的 方法-eat;
那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
也就是不同的对象以 自己的方式响应了相同的消息(响应了eat这个选择器)。
因此也可以说,运行时机制是多态的基础?~~~



9.what is difference between NSNotification and protocol?
通知和协议的不同之处?

答案:协议有控制链(has-a)的关系,通知没有。
首先我一开始也不太明白,什么叫控制链(专业术语了~)。但是简单分析下通知和代理的行为模式,我 们大致可以有自己的理解
简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。
代理按我们的理解,到不是直接说不能一对多,比如我们 知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。
只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明 星要一个发布会,代理人发出处理发布会的消息后,别称B的
发布会了。但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。
因此控制 链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。


12.Singleton?
对于单例的理解

答案:11,12题目其实出的有点泛泛的感觉了,可能说是编程语言需要或是必备的基础。
基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。
进一步点,考虑下如何在多线程访问单例时的安全性。



13.What is responder chain?
说说响应链

答案: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。
可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。因为问的太抽象化了
严重怀疑题目出到越后面就越笼统。

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~
综合一点,我们知道他可以比较大的用处在于可以帮组多 线程编程就好了。


didreceivememorywarning啥时调用

1、当程序收到内存警告时候ViewController会调用didReceiveMemoryWarning这个方法。

2、调用了这个方法之后,对view进行释放并且调用viewDidUnload方法

3、从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。


oc中如何创建一个线程使得一直执行下去?如何结束




18.What is lazy loading?

答案:懒汉模式,只在用到的时候才去初始化。
也可以理解成延时加载。
我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。
一个延时载,避免内存过高,一个异步加载,避免线程堵塞。


19.Can we use two tableview controllers on one viewcontroller?
是否在一个视图控制器中嵌入两个tableview控制器?

答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,
只能说可以嵌入一个tableview视 图。当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,
而是宏观的表示视图控制者,那我们倒是可以把其看成一个视 图控制者,它可以控制多个视图控制器,比如TabbarController
那样的感觉。


36.
for(int index = 0; index < 20; index ++){
NSString *tempStr = @”tempStr”;
NSLog(tempStr);
NSNumber *tempNumber = [NSNumber numberWithInt:2];
NSLog(tempNumber);
}
这段代码有什么问题.?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?为什么?


44.ios平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型吗数据库?
iOS中可以有四种持久化数据的方式: 属性列表、对象归档、SQLite3和Core Data;core data可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。core data提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。在使用core data的时候,你不用安装额外的数据库系统,因为core data使用内置的sqlite数据库。core data将你app的模型层放入到一组定义在内存中的数据对象。core data会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。当core data在对你app数据的改变进行保存的时候,core data会把这些数据归档,并永久性保存。


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

计时器不准确的原因是,计时器只有在 runLoop 的一次循环中被检查,所以如果在上次循环中做了什么耗时的操作,那么计时器就被延后执行了。

正确的方法应该是新开一个线程,然后在新开的线程里设定一个 timer,并执行。


57.堆和栈的区别

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


分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。



10.为什么标准头文件都有类似以下的结构?  
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus
extern “C” {
#endif
/*…*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
是防止该头文件被重复引用。






  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 .不在notificationcenterremove这个对象可能会出现什么问题?

  19.怎样实现一个 singleton的类.给出思路。

  20.什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?.

  21.线程是什么? 有哪些注意事项.?

  22.iphone上有两件事情要做,请问是在一个线程里按顺序做效率高还是两个线程里做效率高?为什么?

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

  24.ios平台怎么做数据的持久化?coredatasqlite有无必然联系?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创建、使用GCDdispatch、使用子类化的 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中去,这个函数的长度可控。但是会有内存叠加的问题。 


sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。 sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。  

15.readwritereadonlyassignretaincopynonatomic属性的作用 

@property是一个属性访问声明,扩号内支持以下几个属性: 

1getter=getterNamesetter=setterName,设置settergetter的方法名 

2readwrite,readonly,设置可供访问级别 

2assignsetter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题 

3retainsetter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料

4copysetter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount1。这是为了减少对上下文的依赖而引入的机制。 

copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。

5nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错 误的结果。加了atomic,setter函数会变成下面这样:


16 什么时候用delegate ,什么时候用Notification ?答:delegate 针对one-to-one 关系,并且reciever 可以返回值 sender notification 可以针对one-to-one/many/none,reciever 无法返回值给sender. 所以,delegate 用于sender 希望接受到 reciever 的某个功能反馈值,notification 用于通知多个object 某个事件。



  在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
                        {lock}
                                if (property != newValue) { 
                                        [property release]; 
                                        property = [newValue retain]; 
                                }
                        {unlock}


16 什么时候用delegate ,什么时候用Notification ?答:delegate 针对one-to-one 关系,并且reciever 可以返回值 sender notification 可以针对one-to-one/many/none,reciever 无法返回值给sender. 所以,delegate 用于sender 希望接受到 reciever 的某个功能反馈值,notification 用于通知多个object 某个事件。 












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值