运行时和常见面试题目

什么是运行时?
1.运行时是一套纯C语言的API
2.编译器最终会把0C代码转换为运行时代码
clang - rewrite-objc xxx.m
3.利用运行时可以实现很多底层的操作
动态添加对象的成员变量和成员方法
动态交换两个方法的实现
获得某个类的所有成员方法,所有成员变量
如何应用运行时?
1.将某些OC代码转为运行时代码
2.拦截系统自带的方法调用,比如拦截imageNamed:viewDidLoad.alloc
3.实现字典和模型的自动转换
4.实现分类也可以增加属性(每个对象的属性互不干扰)
5.实现NSCoding的自动归档和自动解归档

1.代理和协议的区别?
协议(protocol),就是使用了这个协议后,必须按照协议规定的内容来处理事情,协议中要求的方法必须实现(@optional的方法除外)。

代理(delegate),顾名思义就是委托别人办事,当一件事情发生后,自己不处理,让别人来处理。

delegate和protocol没有关系。delegate本身是一种设计模式。是把一个类自己需要做的一部分事情,让另一个类(也可以就是自己本身)来完成。


代理是一种设计模式,一种设计思想

协议是从类中抽出来的一系列方法,但方法的实现是在实现这个协议的类中,任何实现这个协议的类都需要实现协议类中的@require方法

2.OC中创建线程的方法是什么?如果在主线程中执行代码,方式是什么?如果想延时代码,方法又是什么?

线程创建有三种方法:使用NSThread创建、使用 GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是 performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone

10.  O C 中创建线程的方法是什么?如果 指定 在主线程中执行代码 如何 延时执行代码
1>  创建线程的方法
➢  NSThread
➢  NSOperationQueue NSOperation
➢  GCD
2>  主线程中执行代码
➢  [self performSelectorOnMainThread: withObject: waitUntilDone:];
➢  [self performSelector: onThread:[NSThread mainThread] withObject: waitUntilDone:];
➢  dispatch_async(dispatch_get_main_queue(), ^{

});

3>  延时执行
➢  double delayInSeconds = 2.0;

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 

(int64_t)(delayInSeconds * NSEC_PER_SEC));

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){        

});

➢  [self performSelector: withObject: afterDelay:];
➢ [NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:];

3.OC的类别可以多继承吗?没有的话用什么来代替。可以实现多个接口吗?Category是什么?重写一个类的方式用继承好还是分类好?为什么?

1.不可以多继承,ocoa 中所有的类都是NSObject 的子类,多继承在这里是用protocol 委托代理来实现的
 ,ood的多态特性在obj-c中通过委托来实现。

 

 可以,分类好,分类和扩展的区别

1> 分类是有名称的,类扩展没有名称

2> 分类只能扩充方法、只能生产get和set方法,不能生成下划线的成员变量不能扩充成员变量;类扩展可以扩充方法和成员变量

3> 类扩展一般就写在.m文件中,用来扩充私有的方法和成员变量(属性)

4> 分类是OC特有语法, C++有多继承 OC有协议


Category是类目。用类目好,因为继承要满足a is a b的关系,而类目只需要满足a has a b的关系,局限性更小,你不用定义子类就能扩展一个类的功能,还能将类的定义分开放在不同的源文件里, 用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。


4.OC有哪些数据持久化方式?

对于数据的持久化存储,ios中一般提供了4种不同的机制。

1.属性列表

2.对象归档

3.数据库存储(SQLite3)

4.苹果公司提供的持久性工具Core Data。



5.你用过NSOperationQueue吗?为什么使用?实现了什么?与GCD区别与类似的地方?

  1> GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装

2> GCD只支持FIFO的队列,NSOperationQueue可以很方便地调整执行顺序、设置最大并发数量

3> NSOperationQueue可以在轻松在Operation间设置依赖关系,而GCD需要写很多的代码才能实现

4> NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)

5> GCD的执行速度比NSOperationQueue快


任务之间不太互相依赖:GCD

任务之间有依赖\或者要监听任务的执行情况:NSOperationQueue

6.oc 优缺点
优:可使用分类,和代理实现多继承

缺 :没有多继承

obj-c的优缺点objc

优点:  

1) Cateogies   2) Posing   3) 动态识别   4) 指标计算   5)弹性讯息传递   6) 不是一个过度复杂的 C 衍生语言   7) Objective-C 与 C++ 可混合编程

缺点:  

1) 不支援命名空间   2)  不支持运算符重载  3) 不支持多重继承  4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。


7、MVC是什么?有什么特性?

–      MVC是一种设计模式,由模型、视图、控制器3部分组成。

–      模型:保存应用程序数据的类,处理业务逻辑的类

–      视图:窗口,控件和其他用户能看到的并且能交互的元素

–      控制器:将模型和试图绑定在一起,确定如何处理用户输入的类


MVC是模型、试图、控制开发模式,对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据


31、简述MVC模式中M、V、C分别指代什么及发挥的作用?

MVC开始是存在于Desktop(桌面)程序中的,M是指数据模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

 

视图是用户看到并与之交互的界面,视图没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。

 

模型表示企业数据和业务规则,模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

 

控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。


 线程和进程的区别?

答:主要不同的是操作系统资源管理方式

线程是一个进程中不同的执行路径,线程有自己的堆、局部变量

进程有独立的地址空间,一个线程死掉,整个进程就会死掉


19.Can we use two tableview controllers on one viewcontroller?

是否在一个视图控制器中嵌入两个tableview控制器?

答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,

只能说可以嵌入一个tableview视图。当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,

而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController

那样的感觉



16.Is there any garbage collection mechanism in Objective C.?

OC的垃圾回收机制?

答案: OC2.0有Garbage collection,但是iOS平台不提供。

一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。

但是差了大部分资料,貌似不要和arc机制搞混就好了。


20.Can we use one tableview with two different datasources? How you will achieve this?

一个tableView是否可以关联两个不同的数据源?你会怎么处理?

答案:首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。

因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据自己的需要去设置如相关的数据源。

因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛呢?想让列表如何显示,不同的数据源分区块显示?

2.What is advantage of categories? What is difference between implementing a category and inheritance?
类别的作用?继承和类别在实现中有何区别?

答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
 继承可以增加,修改或者删除方法,并且可以增加属性。

3.Difference between categories and extensions?
类别和类扩展的区别。

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


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


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


lymorphism?
关于多态性


答案:多态,子类指针可以赋值给父类。
这个题目其实可以出到一切面向对象语言中,
因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。
最重要的是转化成自我理解。



57. 堆和栈的区别

管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
申请大小:
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统 预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示 overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地 址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个 问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由 alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的 效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。


67. obj-c的优缺点

objc优点:
 1) Cateogies 
 2) Posing 
 3) 动态识别
 4) 指标计算 
 5)弹性讯息传递
 6) 不是一个过度复杂的 C 衍生语言
 7) Objective-C 与 C++ 可混合编程

缺点: 
 1) 不支援命名空間 
 2) 不支持运算符重载
3) 不支持多重继承
4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值